通过for语句遍历System.Collections.Generic.Dictionary

8

我有一个快速的问题。在C#中,是否有一种简单的方法可以通过for语句轻松循环遍历System.Collections.Generic.Dictionary

谢谢提前。


你在尝试做什么?你是在寻找特定的值还是键值对? - ChrisBD
我猜你是想用foreach而不是for? - Jon Skeet
9个回答

12
你可以使用foreach:
Dictionary<string,string> dictionary = new Dictionary<string,string>();

// ...

foreach (KeyValuePair<string,string> kv in dictionary) 
{
    string key = kv.Key;
    string value = kv.Value;
}

的确,这个问题已经在此期间得到了修复。 - Philippe Leybaert

7

没有合理的方法,不行。您可以使用Linq扩展ElementAt

for (int i = 0; i < dictionary.Keys.Count; i++)
{
    Console.WriteLine(dictionary.ElementAt(i).Value);                
}

...但我真的看不出有什么意义。只需使用常规的foreach方法即可。如果您因某种原因需要在迭代时跟踪索引,可以在“旁边”完成:

int index = 0;
foreach (var item in dictionary)
{
    Console.WriteLine(string.Format("[{0}] - {1}", index, item.Value));

    // increment the index
    index++;
}

3
有几种方法。 通过循环遍历键:
foreach(var key in myDictionary.Keys)

循环遍历数值:
foreach(var value in myDic.Values)

遍历键值对:

foreach(KeyValuePair<K, V> p in myDic)
{  
     var key = p.Key;
     var value = p.Value
}

0
如果不一定要使用“for”循环,也许可以使用Dictionary.GetEnumerator Method和“while”循环 - 这也是一个相当简单的选择 在我看来
var enumerator = d.GetEnumerator();
while (enumerator.MoveNext())
{
var pair = enumerator.Current;
b += pair.Value;
}
enumerator.Dispose();

来自C# 字典 GetEnumerator的代码片段


为什么要使用这种方法而不是使用“foreach”?此外,您没有处理枚举器。 - Servy
无论是你的代码还是别人的,都不重要。它不是好的代码,你应该修复它或者不使用它。释放枚举器很重要;如果你想显式地枚举,你需要这样做。至于它是否比foreach更好,它正是foreach要做的事情。foreach只是这个的语法糖(除了foreach会正确地执行,而不像你的代码)。foreach不会更慢;它正在做同样的事情。 - Servy

0

菲利普已经掌握了foreach,虽然我通常会简化为:

foreach (var pair in dictionary) 
{
    var key = pair.Key;
    var value = pair.Value;
}

无法使用for循环遍历这个键值对集合,因为它们没有按顺序存储。但你可以将键或值作为集合进行遍历。


在一般情况下,使用“var”是非常糟糕的做法。 - Nyerguds
@Nyerguds,这是一个非常笼统和客观的陈述。它也是不正确的 - 在使用匿名类型的任何情况下,var关键字绝对是必不可少的。此外,在这种情况下,提问者没有指定字典上的通用类型,我发现(在现实世界中)有时需要更改类型。我的var使用使得字典的确切类型无关紧要,并且是适用于任何通用类型的代码。有很多地方我不会让var通过代码审查,但在示例片段中,它是可以接受的。 - Keith

0

当然可以做到,但在我看来有点傻

        Dictionary<string,string> dictionary = new Dictionary<string, string>();
        Dictionary<string, string>.Enumerator enumerator = dictionary.GetEnumerator();
        for (int i = 0; i < attributeValues.Count;i++ )
        {
            KeyValuePair<string, string> current = enumerator.Current;
            //do something usefull
            enumerator.MoveNext();
        }

这样做唯一得到的是一个(相当无用的)索引,如果这是实际目标,最好使用类似这样的东西:

        int currentIndex = 0;
        foreach (KeyValuePair<string, string> keyValuePair in dictionary)
        {
            //do something usefull
            currentIndex++;
        }

0
不,for 主要用于带有索引的集合。但是你可以很容易地使用 foreach 进行遍历。

0

如果您正在使用3.5或更高版本的Net,则可以使用LINQ和谓词来定位特定的值或值。 字典不一定按顺序存储其KeyValue对(无论是按条目顺序还是按键顺序)。


-1

你可以循环遍历键值

 for(int i = 0; i < myDictionary.Keys.Length; ++i)
      myDictionary.Keys[i] ...

或者这些数值

 for(int i = 0; i < myDictionary.Values.Length; ++i)
      myDictionary.Values[i] ...

或者像菲利普所展示的那样两者都可以


无法编译:“Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.Dictionary<TKey,TValue>KeyCollection'” - Fredrik Mörk
他正在寻找:计数而不是长度,这仅适用于“普通”数组。 - Oxymoron
@Oxymoron:即使使用Count,尝试通过索引(Keys[i])访问Keys集合中的元素仍然会导致构建失败(这就是我在评论中提到的错误)。 - Fredrik Mörk

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