浏览字典的更好方法是什么?当我有IDictionary时,我以前使用下面的代码:
假设我有名为freq
IEnumerator enums = freq.GetEnumerator();
while (enums.MoveNext())
{
string word = (string)enums.Key;
int val = (int)enums.Value;
.......... and so on
}
但现在,我想用字典
做同样的事情答案 0 :(得分:15)
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对抗词典:
答案 1 :(得分: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
结构这是你通常不需要担心的细节。)
答案 2 :(得分:4)
foreach
语句通过枚举器自动迭代。
foreach (KeyValuePair<string,int> entry in freq) {
string word = entry.Key;
int val = entry.Value;
.......... and so on
}