2010-01-20 90 views
6

我有一个简单的问题。有没有方法通过System.Collections.Generic.Dictionary通过for声明在C#中轻松循环?通过语句环通过System.Collections.Generic.Dictionary

在此先感谢。

+0

什么是你想要做的代码片段?您是否在寻找特定的Value或KeyValue对? – ChrisBD 2010-01-20 08:25:27

+0

我认为你的意思是foreach而不是for? – 2010-01-20 08:25:40

回答

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++; 
} 
11

可以使用的foreach:

Dictionary<string,string> dictionary = new Dictionary<string,string>(); 

// ... 

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

这应该是'foreach'。 – GraemeF 2010-01-20 08:26:06

+0

事实上,它在此期间已得到修复 – 2010-01-20 08:26:55

+0

+1你击败了我Philippe。 – ChrisBD 2010-01-20 08:28:49

0

没有,for主要是为了与指数的集合。但是,您可以很容易地将foreach覆盖在上面。

-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] ... 

以上二者的菲利普表示

+0

这不会编译'不能用[]索引到'System.Collections.Generic.Dictionary KeyCollection'的表达式'' – 2010-01-20 08:31:07

+0

他正在寻找:Count而不是Length,它只适用于'普通'数组 – Oxymoron 2010-01-20 08:39:29

+0

@ Oxymoron:即使使用'Count',试图通过索引('Keys [i]')访问'Keys'集合中的元素仍然会破坏构建(这是我在我的评论中提到的错误)。 – 2010-01-20 08:46:46

0

如果您正在使用.NET 3.5或更高版本,那么你可以使用LINQ和一个预定位来定位一个特定的值或值。 词典不一定按顺序存储它们的KeyValue对(通过输入顺序或按键顺序)。

2

有几种方法。 循环通过按键:

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

菲利普拿到了它的foreach,但我通常会简化为:

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

使用for循环无法循环访问这组键值对,因为它们不是按顺序存储的。您可以循环使用键或值作为集合。

+0

使用“var”通常是非常糟糕的做法。 – Nyerguds 2013-01-07 12:51:50

+0

@Nyerguds这是一个非常清晰和客观的陈述。这也不正确 - 在使用匿名类型的任何情况下,'var'关键字都是非常重要的。另外,在这种情况下,提交者没有在字典上指定泛型,我发现(在现实世界中)有时需要更改类型。我使用'var'使得字典的确切类型不相关,并且是可以工作的代码,而不管通用类型如何。有很多地方我不会让'var'通过代码审查,但是在一个示例代码片段中它很好。 – Keith 2013-01-07 13:21:42

0

它可以OFC可以做到,但它是一个有点傻IMO

 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++; 
     } 
-1

如果它没有成为一个“为“ - 圈,也许使用Dictionary.GetEnumerator Method用“而” -loop是一种选择 - 这是很容易的,以及恕我直言

var enumerator = d.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 
var pair = enumerator.Current; 
b += pair.Value; 
} 
enumerator.Dispose(); 

C# Dictionary GetEnumerator

+0

你为什么要用'foreach'做这个?此外,你不处理enumeartor。 – Servy 2014-12-05 16:11:38

+0

代码片段来自http://www.dotnetperls.com/dictionary-getenumerator,它不是我的代码。根据该网站,使用枚举器比'foreach'有更好的性能 - 这就是为什么我认为值得一提的是枚举器 – user4531 2014-12-08 09:52:48

+0

不管它的代码是否重要。这不是很好的代码,你应该修复它,或者不要使用它。处理统计员是很重要的。如果你想明确枚举,你需要这样做。至于它比“foreach”更好,这正是“foreach”所要做的。 'foreach'只是语法糖(除了'foreach'正确,不像你的代码)。 “foreach”不会变慢;它也在做同样的事情。 – Servy 2014-12-08 15:15:09