2013-03-06 14 views
19

Generalnie używam pętli foreach do iteracji poprzez słownik.Używanie pętli for do iteracji poprzez słownik

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

W tym przypadku chcę przyciąć wpisy białej spacji, ale pętla foreach nie pozwala na to.

foreach (var kvp in dictSummary) 
{ 
    kvp.Value = kvp.Value.Trim();  
} 

Jak mogę to zrobić z pętlą for?

for (int i = dictSummary.Count - 1; i >= 0; i--) 
{ 
} 
+0

możliwe duplikat [? Jaki jest najlepszy sposób do iteracyjne nad Dictionary w C#] (http://stackoverflow.com/questions/141088/what -is-the-best-to-iterate-over-a-słownik-in-c) – publicgk

+3

lub to;) http://stackoverflow.com/questions/1070766/editing-dictionary-values-in-a- foreach-loop – Belial09

+1

@ Belial09 W pytaniu zadanym w zamieszczonym przez ciebie linku nie wydaje się, że klucze zostały zmodyfikowane; tylko wartości. – joce

Odpowiedz

14

KeyValuePair<TKey, TValue> nie pozwala ustawić Value, jest niezmienna.

Trzeba będzie zrobić to tak:

foreach(var kvp in dictSummary.ToArray()) 
    dictSummary[kvp.Key] = kvp.Value.Trim(); 

Ważnym elementem jest tu ToArray. To skopiuje słownik do tablicy, więc zmiana słownika wewnątrz foreach nie spowoduje wygenerowania InvalidOperationException.

Alternatywnym podejściem byłoby użyć LINQ za ToDictionary metody:

dictSummary = dictSummary.ToDictionary(x => x.Key, x => x.Value.Trim()); 
32

co na ten temat?

for (int i = dictSummary.Count - 1; i >= 0; i--) { 
    var item = dictSummary.ElementAt(i); 
    var itemKey = item.Key; 
    var itemValue = item.Value; 
} 
+5

Chociaż możliwe jest użycie takiego kodu, nie polecam go. 'Enumerable.ElementAt' nie jest tak naprawdę najlepszym sposobem uzyskania dostępu do elementów w słowniku ... Twój kod jest prawdopodobnie O (n^2), ponieważ słownik nie zezwala na dostęp do elementów według pozycji. –

+1

Dlaczego przeprowadzasz iterację od końca do początku? Nie mów mi, to ze względu na wydajność ... – DHN

+0

@AlexeiLevenkov ... Dzięki. Nie wiedziałem o tym. właśnie przeszukałem problem i wygląda na to ogromną wadę. Dzięki jeszcze raz. –

3

Nie trzeba używać .ToArray() lub .ElementAt(). To jest tak proste, jak dostęp do słownika z kluczem:

dictSummary.Keys.ToList().ForEach(k => dictSummary[k] = dictSummary[k].Trim()); 
Powiązane problemy