2010-11-02 9 views

Trả lời

5

Một NameValueCollection có thể lấy yếu tố của chỉ số (nhưng bạn không thể yêu cầu các chỉ số của một phím cụ thể hoặc phần tử). Vì vậy,

var coll = new NameValueCollection(); 
coll.Add("Z", "1"); 
coll.Add("A", "2"); 
Console.WriteLine("{0} = {1}", coll.GetKey(0), coll[0]); // prints "Z = 1" 

Tuy nhiên, nó cư xử kỳ quặc (so với một IDictionary) khi bạn thêm một phím nhiều lần:

var coll = new NameValueCollection(); 
coll.Add("Z", "1"); 
coll.Add("A", "2"); 
coll.Add("Z", "3"); 
Console.WriteLine(coll[0]); // prints "1,3" 

Các hành vi cũng được ghi chép lại, tuy nhiên.

Thận trọng: NameValueCollection không không triển khai IDictionary.


Là một sang một bên: Dictionary<K,V> không có bất kỳ chỉ số bạn có thể sử dụng, nhưng miễn là bạn chỉ thêm yếu tố, và không bao giờ loại bỏ bất kỳ, thứ tự của các yếu tố là thứ tự chèn. Lưu ý rằng đây là một chi tiết thực hiện hiện tại của Microsoft: tài liệu rõ ràng nói rằng thứ tự là ngẫu nhiên, vì vậy hành vi này có thể thay đổi trong các phiên bản tương lai của .NET Framework hoặc Mono.

+0

Điều này thật tuyệt. Một cách thay thế cho Hashtable và Dictionary rất đơn giản. Ngoài ra, lưu ý về thứ tự sắp xếp mặc định của Dictionary rất hữu ích. –

+0

Hãy nhớ thêm: sử dụng System.Collections.Specialized; –

5

Nếu đây là thứ bạn cần theo dõi hiệu quả thì bạn đang sử dụng cấu trúc dữ liệu sai. Thay vào đó, bạn nên sử dụng số SortedDictionary trong đó khóa được gắn thẻ chỉ mục khi được thêm (hoặc dấu thời gian) và một tuỳ chỉnh IComparer so sánh hai khóa dựa trên chỉ mục (hoặc dấu thời gian).

3

Có bất kỳ Hashtable hoặc Dictionary in .NET nào cho phép bạn truy cập thuộc tính .Index cho mục nhập theo thứ tự mà nó đã được thêm vào bộ sưu tập không?

số Bạn có thể enumarate trên tất cả các mục trong một Hastable hoặc từ điển, nhưng đây không phải gaurenteed được trong bất kỳ loại trật tự (có khả năng họ không nhất)

Bạn sẽ phải sử dụng một trong hai một cấu trúc dữ liệu khác hoàn toàn, (chẳng hạn như SortedDictionary hoặc SortedList) hoặc sử dụng một danh sách riêng biệt để lưu trữ thứ tự mà chúng được thêm vào. Bạn sẽ muốn bọc danh sách theo thứ tự và từ điển của bạn/hashtable trong lớp khác để giữ cho chúng được đồng bộ.

3

Bạn có thể sử dụng danh sách riêng để lưu trữ các phần tử theo thứ tự chúng được thêm vào. Một cái gì đó dọc theo dòng của mẫu sau:

public class ListedDictionary<TKey, TValue> : IDictionary<TKey, TValue> 
{ 
    List<TValue> _list = new List<TValue>(); 
    Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey,TValue>(); 

    public IEnumerable<TValue> ListedValues 
    { 
     get { return _list; } 
    } 

    public void Add(TKey key, TValue value) 
    { 
     _dictionary.Add(key, value); 
     _list.Add(value); 
    } 

    public bool ContainsKey(TKey key) 
    { 
     return _dictionary.ContainsKey(key); 
    } 

    public ICollection<TKey> Keys { get { return _dictionary.Keys; } } 

    public bool Remove(TKey key) 
    { 
     _list.Remove(_dictionary[key]); 
     return _dictionary.Remove(key); 
    } 

    // further interface methods... 
} 
1

Một cách khác là để tạo ra một mảng của các cấu trúc, vì vậy thay vì sử dụng

dictionary.Add{"key1","value1"} 

bạn tạo một cấu trúc với phím/giá trị như:

public struct myStruct{ 
    private string _sKey; 
    public string sKey{ 
     get { return _sKey; } 
     set { _sKey = value; } 
    } 
    private string _sValue; 
    public string sValue { 
     get { return _sValue; } 
     set { _sValue = value; } 
    } 
} 

// create list here 
List<myStruct> myList = new List<myStruct>(); 

// create an instance of the structure to add to the list 
myStruct item = new myStruct(); 
item.sKey = "key1"; 
item.sValue = "value1"; 

// then add the structure to the list 
myList.Add(item); 

Sử dụng phương pháp này, bạn có thể thêm kích thước vào danh sách mà không cần nỗ lực quá nhiều, chỉ cần thêm một thành viên mới trong cấu trúc.

Lưu ý, nếu bạn cần sửa đổi các mục trong danh sách sau khi chúng được thêm vào, bạn sẽ phải thay đổi cấu trúc thành một lớp. Xem trang này để biết thêm thông tin về vấn đề này: error changing value of structure in a list

2

Hãy xem lớp OrderedDictionary. Không chỉ bạn có thể truy cập nó thông qua các phím, mà còn thông qua một chỉ mục (vị trí).