2011-08-23 15 views
6

Ben bir sözlük var:Sözlük öğeleri yinelenirken değerleri nasıl güncellersiniz?

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

ve bunun gibi tüm öğeler arasında yineleme ederken değerlerini güncellemek istiyorum:

"Collection was modified; enumeration operation may not execute" 
:

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

bana bildiren bir hata veriyor

bana neden bu hatayı verdiğimi söyleyen var, çünkü değeri ekleyen bir tane daha fonksiyonum var ve buton tıklandığında çağrılır:

public static void Increment(string RepId, int amount) 
{ 
    long _value = Convert.ToInt64(Reps[RepId]); 
    _value = _value + amount; 
    Reps[RepId] = _value; 
} 
ve bu fonksiyon iyi çalışıyor. Yani tüm değerleri güncellerken sorun nedir? Ve bunun için çözüm nedir?

cevap

4

daha basitleştirilmiş Bunu yapmak : o da orijinal nesneyi işaret olarak

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

aynı hatayı vereceğiz ve ToList() eklendiğinde bu Listesinin yeni bir nesne

4

sorun değerlerini güncelleyerek hayır, sadece foreach iterated yapılırken foreach() dayalıdır koleksiyonu değiştiremezsiniz olduğunu. Bu çalışacak bu

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

gibi

deneyin somehting.

+1

onun wokring ama yalnızca bir kez oluşturulan benim arayışımın bir parçası Çözüm üzerinde ... hatanın sebebi hakkında daha fazla bilgi verebilir misiniz? –

+1

Peki, çünkü foreach koleksiyona dayanıyor ve eğer koleksiyonu değiştirecekseniz, foreach hangi parçaların işleneceğini ve ne yapamayacağını nasıl belirleyebilir? Örneğin. yineleme sırasında yeni bir Reps [x] eklerseniz, foreach'a katılmayı bekler miydiniz değil mi? – Pleun

3

Bu, öğenin foreach ile döngü sırasında Dictionary<string, long> öğesinde değiştiğinden gerçekleşir. Bunu dene.

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

Şimdi, dictionarys anahtarından oluşturulan bir listenin üstesinden geliyorsunuz. Değiştirilen orijinal koleksiyon olmadığından, hata gider.

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

ve hatanın nedeni kullanımda gerçek nesneyi düzenlemeye çalışıyorsunuz ve daha sonra bunun bir kopyasını ve eğer bu gibi kullanmak şu şekildedir:

İlgili konular