2010-10-24 34 views
74

Câu hỏi của tôi là về liệt kê các yếu tố điểnTrình tự của các yếu tố trong từ điển

// Dictionary definition 
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>(); 

// add values using add 

_Dictionary.Add("orange", "1"); 
_Dictionary.Add("apple", "4"); 
_Dictionary.Add("cucumber", "6"); 

// add values using [] 

_Dictionary["banana"] = 7; 
_Dictionary["pineapple"] = 7; 

// Now lets see how elements are returned by IEnumerator 
foreach (KeyValuePair<string, string> kvp in _Dictionary) 
{ 
    Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value)); 
} 

Để những gì sẽ được các yếu tố được liệt kê? Tôi có thể buộc thứ tự chữ cái không?

+1

bản sao có thể có của [Bộ đếm số từ điển của cặp từ khóa trả về giá trị khóa theo thứ tự được thêm vào không? .Net] (http: // stackoverflow.com/questions/1453190/does-the-enumerator-of-a-dictionarytkey-tvalue-return-key-giá trị-cặp-in-the) – nawfal

Trả lời

88

Thứ tự của các phần tử trong từ điển không xác định. Khái niệm về trật tự đơn giản là không được định nghĩa cho hashtables. Vì vậy, không dựa vào liệt kê theo thứ tự như các yếu tố đã được thêm vào từ điển. Điều đó không được bảo đảm.

Trích from the doc:

Đối với mục đích của điều tra, từng hạng mục trong từ điển được coi là một cấu trúc KeyValuePair<TKey, TValue> đại diện cho một giá trị và quan trọng của nó. Thứ tự mà các mục được trả về là không xác định.

+0

Từ điển không được triển khai như một cây như std :: map? Trong trường hợp đó, toán tử so sánh hoặc phương thức Compare() phải xác định thứ tự xác định và sắp xếp theo thứ tự aplphabetically. –

+15

Nếu bạn muốn một đơn đặt hàng được đảm bảo sử dụng 'OrderedDictionary'. –

+3

@Darin - vì mục đích này, tôi đoán SortedDictionary sẽ phù hợp hơn OrderedDictionary. – SoftMemes

3

Các mảng kết hợp (còn gọi là bảng băm) không có thứ tự, có nghĩa là các phần tử có thể được sắp xếp theo bất kỳ cách nào có thể tưởng tượng được.

BAO GIỜ, bạn có thể tìm nạp các khóa mảng (chỉ có các phím), sắp xếp theo thứ tự bảng chữ cái (thông qua chức năng sắp xếp) và sau đó làm việc trên đó.

Tôi không thể cung cấp cho bạn mẫu C# vì tôi không biết ngôn ngữ, nhưng điều này là đủ để bạn tự đi tiếp.

18

Nếu bạn muốn các phần tử được đặt hàng, hãy sử dụng OrderedDictionary. Một từ điển/từ điển thông thường được sắp xếp theo ý nghĩa của bố cục lưu trữ.

+4

OrderedDictionary trong hầu hết các trường hợp là sai. Nó không được sắp xếp theo khóa hoặc giá trị, mà bởi một chỉ số nội bộ. SortedDictionary là một thứ được sắp xếp theo cách người dùng có thể thao tác (khóa mặc định) – Offler

7

Các mục sẽ được trả lại theo thứ tự chúng được lưu trữ trên thực tế trong từ điển, phụ thuộc vào mã băm và thứ tự các mục đã được thêm vào. Vì vậy, thứ tự sẽ có vẻ ngẫu nhiên, và khi thực hiện thay đổi, bạn không bao giờ nên phụ thuộc vào thứ tự ở lại như nhau.

Bạn có thể đặt hàng các mặt hàng khi liệt kê họ:

foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) { 
    ... 
} 

Trong khuôn khổ 2.0 đầu tiên bạn sẽ phải đặt các mục trong một danh sách để sắp xếp chúng:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary); 
items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); }); 
foreach (KeyValuePair<string,string> kvp in items) { 
    ... 
} 
15

Tôi nghĩ tôi trễ cho bữa tiệc này nhưng bạn luôn có thể sử dụng SortedDictionary cho điều đó. Lưu ý rằng theo mặc định, disctionary được Key đặt hàng, trừ khi một bộ so sánh được chỉ định.

Tôi hoài nghi về việc sử dụng OrderedDictionary cho những gì bạn muốn từ tài liệu nói rằng

Các yếu tố của một OrderedDictionary không được sắp xếp theo chìa khóa, không giống như các yếu tố của một lớp SortedDictionary.

8

Đối với một OrderedDictionary:

var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary(); 

_OrderedDictionary.Add("testKey1", "testValue1"); 
_OrderedDictionary.Add("testKey2", "testValue2"); 
_OrderedDictionary.Add("testKey3", "testValue3"); 

var k = _OrderedDictionary.Keys.GetEnumerator(); 
var v = _OrderedDictionary.Values.GetEnumerator(); 

while (k.MoveNext() && v.MoveNext()) { 
    var key = k.Current; var value = v.Current; 
} 

Items được trả về theo thứ tự mà chúng được thêm vào.

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