2015-03-23 25 views
5

Khi câu hỏi cho biết, tôi đang tìm số C# tương đương của LinkedHashMap trong Java.C# tương đương với LinkedHashMap

Tôi cần có thể truy xuất các khóa giá trị theo chỉ mục, nhận kích thước. Tôi cần các yếu tố được sắp xếp theo cách chúng được chèn vào. Một khóa phải khớp với chính xác một giá trị.

Bộ sưu tập Tôi đã cố gắng (Và vấn đề với họ):
NameValueCollection - Cho phép một nhiều liên kết. Tôi đoán điều này gây ra một chi phí không cần thiết.
Đặt hàngDictionary - Không thể truy xuất khóa theo chỉ mục.

EDIT: Người ta đã chỉ ra rằng không có tương đương như vậy tồn tại trong C#. Trong câu hỏi được liên kết, câu trả lời trỏ đến một diễn đàn để triển khai ví dụ, có vẻ như đang bị gỡ xuống. Ai đó có thể cung cấp một ví dụ thực hiện ở đây?

CHỈNH SỬA 2: A CookieCollection từ System.Net dường như là những gì tôi cần. Làm thế nào điều này sẽ phản ứng với kích thước lớn hơn (số lượng các yếu tố)?

+0

No. OP yêu cầu một tính năng cụ thể của LinkedHashMaps khi anh ta hỏi "các thành phần được đặt lại tự động". Jok Skeet sau đó tiến hành đề cập đến tính năng này chỉ có sẵn trong một nhà xây dựng cụ thể. Tôi mặt khác, mong muốn một tương đương lành mạnh của nó. – Hele

+0

Đọc asnwers carfeully: Câu hỏi của bạn: "Tôi đang tìm kiếm tương đương C# của LinkedHashMap trong Java." Trả lời (có thể được tìm thấy trong chuỗi liên kết): "không có sẵn trong C# tương đương cho LinkedHashMap". –

+0

Nếu 'NameValueCollection' hoạt động tốt, nhưng bạn đang" đoán "rằng có" phí không cần thiết ", thì cơ hội mà bạn sẽ nhận thấy phí trên được xếp chồng lên nhau rất nhiều so với bạn. – dasblinkenlight

Trả lời

2

Tôi đã viết cái này, đã làm việc đủ tốt cho tôi trong quá khứ. Hãy cho tôi biết nếu bạn tìm thấy một sai lầm.

using System; 
using System.Collections.Generic; 

class LinkedHashMap<T, U> 
{ 
    Dictionary<T, LinkedListNode<Tuple<U, T>>> D = new Dictionary<T, LinkedListNode<Tuple<U, T>>>(); 
    LinkedList<Tuple<U,T>> LL = new LinkedList<Tuple<U, T>>(); 

    public U this[T c] 
    { 
     get 
     { 
      return D[c].Value.Item1; 
     } 

     set 
     { 
      if(D.ContainsKey(c)) 
      { 
       LL.Remove(D[c]); 
      } 

      D[c] = new LinkedListNode<Tuple<U, T>>(Tuple.Create(value, c)); 
      LL.AddLast(D[c]); 
     } 
    } 

    public bool ContainsKey(T k) 
    { 
     return D.ContainsKey(k); 
    } 

    public U PopFirst() 
    { 
     var node = LL.First; 
     LL.Remove(node); 
     D.Remove(node.Value.Item2); 
     return node.Value.Item1; 
    } 

    public int Count 
    { 
     get 
     { 
      return D.Count; 
     } 
    } 
} 

class LinkedHashMapTest 
{ 
    public static void Test() 
    { 
     var lhm = new LinkedHashMap<char, int>(); 

     lhm['a'] = 1; 
     lhm['b'] = 2; 
     lhm['c'] = 3; 


     Console.WriteLine(lhm['a']); 
     Console.WriteLine(lhm['b']); 
     Console.WriteLine(lhm['c']); 

     Console.WriteLine(lhm.PopFirst()); 
     Console.WriteLine(lhm.PopFirst()); 
     Console.WriteLine(lhm.PopFirst()); 
    } 
} 
+0

Làm thế nào để bạn lặp qua các phần tử trong danh sách từ điển/liên kết? Như tôi đã hiểu, lợi thế của LinkedHashMap là nó giống như một từ điển với thứ tự lặp lại có thể dự đoán được. Vì vậy, tôi cho rằng việc có thể lặp qua các yếu tố sẽ là quan trọng. –

+1

Bạn chỉ có thể trưng ra một trình lặp trên LL ('LinkedList > LL'). – N0thing

Các vấn đề liên quan