2013-03-06 2 views
19

Обычно я использую цикл foreach для итерации через словарь.с использованием цикла for для итерации через словарь

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

В этом случае я хочу обрезать элементы пробела, а петля foreach, однако, не позволяет этого.

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

Как это сделать с помощью цикла for?

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

возможно дубликат: [Что это лучший способ перебрать словарь в C#] (http://stackoverflow.com/questions/141088/what -is-the-best-way-to-iterate-over-a-dictionary-in-c) – publicgk

+3

или это;) http://stackoverflow.com/questions/1070766/editing-dictionary-values-in-a- foreach-loop – Belial09

+1

@ Belial09 В вопросе, заданном в указанной вами ссылке, похоже, что ключи не изменены; просто значения. – joce

ответ

14

KeyValuePair<TKey, TValue> не позволяет установить Value, она неизменна.

Вы должны будете сделать это следующим образом:

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

Важной частью здесь является ToArray. Это скопирует словарь в массив, поэтому изменение словаря внутри foreach не приведет к ошибке InvalidOperationException.

Альтернативный подход будет использовать метод ToDictionary LINQ в:

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

что об этом?

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

Хотя можно использовать такой код, я бы не рекомендовал его. 'Enumerable.ElementAt' на самом деле не лучший способ доступа к элементам в словаре ... Вероятно, ваш код O (n^2), так как Словарь не разрешает доступ к элементам по положению. –

+1

Почему вы итерируете от конца до начала? Не говорите мне, это из-за соображений производительности ... – DHN

+0

@AlexeiLevenkov ... Спасибо. Я не знал об этом. просто искал проблему, и это выглядит огромным недостатком. Еще раз спасибо. –

3

Вам не нужно использовать .ToArray() или .ElementAt(). Это так же просто, как доступ к словарю с ключом:

dictSummary.Keys.ToList().ForEach(k => dictSummary[k] = dictSummary[k].Trim()); 
Смежные вопросы