2013-03-06 2 views
19

Generalmente uso un ciclo foreach per scorrere il dizionario.utilizzando un ciclo for per scorrere un dizionario

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

In questo caso voglio tagliare le voci di spazio bianco e il ciclo foreach non, tuttavia, non tenerne conto.

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

Come posso fare questo con un ciclo for?

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

Eventuali duplicati: [? Qual è il modo migliore per iterare su un dizionario in C#] (http://stackoverflow.com/questions/141088/what -is-the-best-way-to-iterate-over-a-dictionary-in-c) o – publicgk

+3

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

+1

@ Belial09 Nella domanda posta nel link che hai postato, non sembra che le chiavi siano state modificate; solo i valori. – joce

risposta

14

KeyValuePair<TKey, TValue> non consente di impostare il Value, è immutabile.

Si dovrà fare in questo modo:

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

La parte importante qui è la ToArray. Questo copierà il dizionario in un array, quindi cambiare il dizionario all'interno del foreach non getterà un InvalidOperationException.

Un approccio alternativo potrebbe utilizzare il metodo di ToDictionary LINQ:

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

che dire di questo?

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

Anche se è possibile utilizzare tale codice, non lo consiglio. 'Enumerable.ElementAt' non è il modo migliore per accedere agli elementi in un dizionario ... Il tuo codice è probabilmente O (n^2) poiché Dictionary non consente l'accesso agli elementi in base alla posizione. –

+1

Perché stai andando a finire dall'inizio alla fine? Non dirmelo, è per motivi di prestazioni ... – DHN

+0

@AlexeiLevenkov ... Grazie. Non lo sapevo. ho appena cercato il problema e sembra un enorme inconveniente. Grazie ancora. –

3

Non è necessario utilizzare .ToArray() o .ElementAt(). E 'semplice come l'accesso al dizionario con la chiave:

dictSummary.Keys.ToList().ForEach(k => dictSummary[k] = dictSummary[k].Trim());