遍历 C# 字典 <string, int>

5
什么是浏览字典的更好方法?在我有IDictionary时,我曾经使用下面的代码:
假设我有一个名为freq的IDictionary:
IEnumerator enums = freq.GetEnumerator();
while (enums.MoveNext())
{
    string word = (string)enums.Key;
    int val = (int)enums.Value;
    .......... and so on

}

但是现在,我希望使用字典来完成同样的事情

3个回答

15
< p>通过foreach循环遍历时,默认的枚举器会给出一个KeyValuePair<TKey, TValue>

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

这只是将代码编译为直接使用枚举器的形式,就像您旧代码中的方式。

或者您可以直接枚举.Keys.Values (但在这种情况下只能获取键或值):

foreach (var key in dictionary.Keys)

foreach (var val in dictionary.Values)

当然,LINQ也适用于字典:

C#字典中的LINQ


对于使用 Var,这是否会影响键和值的数据类型,分别为字符串和整数?我不太善于使用 Var,所以我问了一下。 - Jone Mamni
2
@JoneMamni:不是的 - var 只是为变量赋予一个从分配值的编译时类型推断出来的类型。在执行时没有影响。 - Jon Skeet
1
@JoneMamni 不是的,在这种情况下,var 是从键和值的类型推断出来的,对于你的情况,使用泛型字典,类型分别为字符串和整数。 - Adam Houldsworth

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 实际上等同于使用它,但不等同于声明一个 IEnumerator<KeyValuePair<string, int>> - 它实际上将使用嵌套的 Dictionary.Enumerator 结构。这通常是你不需要担心的细节。)


4
< p > foreach语句会自动遍历枚举器。

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

}

那么,哪个更快?使用IEnumerator还是foreach(KeyValuePair<string,int>),因为我的字典包含超过200000个单词。 - Jone Mamni
2
foreach 在内部调用 GetEnumeratorMoveNext。因此,这不应该有任何区别。而且,泛型变量应该会更快一些,因为不再需要转换。特别是 int 不必装箱和拆箱。 - Olivier Jacot-Descombes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接