2012-05-08 32 views
5

Cách tốt hơn để Điều hướng thông qua từ điển là gì? Tôi sử dụng để sử dụng mã dưới đây khi tôi đã IDictionary:Điều hướng qua từ điển <string, int> C#

Giả sử rằng tôi có IDictionary tên freq

IEnumerator enums = freq.GetEnumerator(); 
while (enums.MoveNext()) 
{ 
    string word = (string)enums.Key; 
    int val = (int)enums.Value; 
    .......... and so on 

} 

nhưng bây giờ, tôi muốn làm điều tương tự sử dụng từ điển

Trả lời

4

Tuyên bố foreach tự động lặp lại thông qua các điều tra viên.

foreach (KeyValuePair<string,int> entry in freq) { 
    string word = entry.Key; 
    int val = entry.Value; 
    .......... and so on 

} 
+0

vì vậy, cái nào sẽ nhanh hơn? bằng cách sử dụng IEnumerator hoặc foreach (KeyValuePair ) bởi vì từ điển của tôi chứa hơn 200000 từ, –

+2

'foreach' gọi' GetEnumerator' và 'MoveNext' trong nội bộ. Vì vậy, điều này sẽ không tạo ra bất kỳ sự khác biệt nào.Ngoài ra các biến thể chung nên được phần nào nhanh hơn, kể từ khi đúc không được yêu cầu nữa. Đặc biệt 'int' không được đóng hộp và unboxed. –

15

Các điều tra viên mặc định từ một foreach mang đến cho bạn một KeyValuePair<TKey, TValue>:

foreach (var item in dictionary) 
// foreach (KeyValuePair<string, int> item in dictionary) 
{ 
    var key = item.Key; 
    var value = item.Value; 
} 

này chỉ đơn giản là biên dịch thành mã mà làm việc trực tiếp với điều tra như trong mã cũ của bạn.

Hoặc bạn có thể liệt kê các .Keys hoặc .Values trực tiếp (nhưng bạn chỉ nhận được một phím hoặc một giá trị trong trường hợp đó):

foreach (var key in dictionary.Keys) 

foreach (var val in dictionary.Values) 

Và hoặc khóa học LINQ làm việc chống lại các từ điển:

C# linq in Dictionary<>

+0

để sử dụng Var, điều này có ảnh hưởng đến loại dữ liệu của khóa và giá trị theo chuỗi, tương ứng không? Tôi không thân thiện với việc sử dụng var, đó là lý do tại sao tôi yêu cầu –

+2

@JoneMamni: Không - 'var' chỉ cung cấp cho biến kiểu được suy ra từ loại * thời gian biên dịch * của giá trị được gán. Không có tác động vào thời gian thực hiện. –

+1

@JoneMamni Không, trong trường hợp này 'var' được suy ra từ loại khóa và giá trị, trong trường hợp của bạn với một từ điển chung này sẽ là chuỗi và int. –

8

Vâng, bạn có thể làm điều tương tự với Dictionary, nhưng sẽ sạch hơn khi sử dụng foreach trong cả trường hợp:

foreach (var entry in dictionary) 
{ 
    string key = entry.Key; 
    int value = entry.Value; 
    // Use them... 
} 

này tương đương với:

using (var iterator = dictionary.GetEnumerator()) 
{ 
    while (iterator.MoveNext()) 
    { 
     var entry = iterator.Current; 
     string key = entry.Key; 
     int value = entry.Value; 
     // Use them... 
    } 
} 

Đó là rất hiếm khi hữu ích để gọi một cách rõ ràng GetEnumerator và lặp chính mình. Nó thích hợp trong một số ít trường hợp, chẳng hạn như khi bạn muốn xử lý giá trị đầu tiên khác nhau, nhưng nếu bạn định xử lý tất cả các mục nhập theo cách tương tự, hãy sử dụng foreach.

(Lưu ý rằng nó thực sự là tương đương với sử dụng var ở đây, nhưng không tương đương với tuyên bố một IEnumerator<KeyValuePair<string, int>> - nó sẽ thực sự sử dụng lồng nhau Dictionary.Enumerator struct Đó là một chi tiết mà bạn thường không cần phải lo lắng..)

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