5

浏览字典的更好方法是什么?当我有 IDictionary 时,我曾经使用下面的代码:

假设我有 IDictionary 命名freq

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

}

但现在,我想用字典做同样的事情

4

3 回答 3

15

a 中的默认枚举器foreach为您提供KeyValuePair<TKey, TValue>

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

这只是编译成直接与枚举器一起工作的代码,就像在旧代码中一样。

或者你可以直接枚举.Keysor .Values(但在这种情况下你只能得到一个键或一个值):

foreach (var key in dictionary.Keys)

foreach (var val in dictionary.Values)

或者当然 linq 对字典起作用:

字典中的 C# linq<>

于 2012-05-08T12:54:29.330 回答
8

好吧,你可以用 做同样的事情,但在这两种Dictionary情况下使用它会更干净:foreach

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

这相当于:

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

显式调用和迭代自己很少有用。GetEnumerator它适用于少数情况,例如当您想以不同方式处理第一个值时,但如果您要以相同方式处理所有条目,请使用foreach.

(请注意,它实际上等同于var在此处使用,但等同于声明 an IEnumerator<KeyValuePair<string, int>>- 它实际上将使用嵌套Dictionary.Enumerator结构。这是您通常不需要担心的细节。)

于 2012-05-08T12:54:34.460 回答
4

foreach语句通过枚举器自动迭代。

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

}
于 2012-05-08T13:01:21.413 回答