2011-08-23 10 views
6

Ho un dizionario:come aggiornare i valori mentre si iterano gli elementi del dizionario?

Dictionary<string, long> Reps = new Dictionary<string, long>(); 

e voglio aggiornare i valori, mentre l'iterazione attraverso tutti gli elementi, in questo modo:

foreach (string key in Reps.keys) 
{ 
    Reps[key] = 0; 
} 

mi sta dando un errore che dice:

"Collection was modified; enumeration operation may not execute" 

qualcuno può dirmi perché mi sta dando questo errore, perché ho un'altra funzione che aggiunge il valore, e viene chiamata quando si fa clic sul pulsante:

public static void Increment(string RepId, int amount) 
{ 
    long _value = Convert.ToInt64(Reps[RepId]); 
    _value = _value + amount; 
    Reps[RepId] = _value; 
} 

e questa funzione funziona correttamente. quindi qual è il problema quando si aggiornano tutti i valori? E qual è la soluzione per questo?

risposta

4

più semplificata, fare questo:

foreach (string key in Reps.keys.ToList()) 
{ 
    Reps[key] = 0; 
} 

e la ragione per l'errore è che si tenta di modificare l'oggetto reale che è in uso e se si effettua una copia di esso e quindi utilizzare in questo modo :

var repscopy = Reps; 
foreach (string key in repscopy.keys) 
    { 
     Reps[key] = 0; 
    } 

ti do lo stesso errore anche indicando l'oggetto originale, e quando si aggiunge il ToList() ha creato un nuovo oggetto di Lista

4

Il problema non è l'aggiornamento dei valori, non è possibile modificare la raccolta su cui si basa foreach() mentre il foreach viene iterato.

Prova somehting come questo

List<string> keylist = Reps.keys.ToList(); 
foreach(string r in keylist) 
{ 
Reps[r] = 0; 
} 

questo dovrebbe funzionare.

+1

sua wokring ma avete solo rispondeva parte dei miei articoli su la soluzione ... puoi spiegare di più su che cosa è la causa dell'errore? –

+1

Beh, suppongo che il foreach sia basato sulla collezione e se cambi la collezione come può il foreach determinare quali parti sono lasciate da elaborare e cosa no? Per esempio. se dovessi aggiungere un nuovo Reps [x] durante l'iterazione ti aspetteresti che partecipi al foreach oppure no? – Pleun

3

Questo accade perché si sta modificando l'elemento nel Dictionary<string, long> mentre si esegue il ciclo su di esso con foreach. Prova questo.

foreach (string key in Reps.Keys.ToList()) 
{ 
    Reps[key] = 0; 
} 

Ora si esegue il ciclo su un elenco creato dalla chiave dictionarys. Poiché non è la raccolta originale che è stata modificata, l'errore andrà via.

Problemi correlati