2010-01-20 87 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