2009-06-04 13 views

Odpowiedz

4

To nie jest tak wyraźny jak inne sposoby, ale to powinno działać prawidłowo:

dictionary.Keys.ToList().ForEach(i => dictionary[i] = 0); 

Moja druga alternatywa byłaby dokonać metodę rozszerzenia ForEach podobny do tego:

public static class MyExtensions 
{ 
    public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) 
    { 
     foreach (var item in items) 
     { 
      action(item); 
     } 
    } 
} 

Następnie użyj go w ten sposób:

dictionary.ForEach(kvp => kvp.Value = 0); 

To jednak nie zadziała w tym przypadku, ponieważ wartość nie może być taka podpisano.

+0

W zasadzie nigdy nie użyłbym pierwszego fragmentu kodu w rzeczywistości. Metoda rozszerzenia może być świetna, ale ponieważ nie można jej przypisać do wartości, słowniki nie pozwalają na wiele. –

+1

Nie tak jasne * i * mniej wydajne (tworzy sklonowaną listę kluczy i wykonuje 2 iteracje zamiast 1) ... zwycięzca! –

4

LINQ jest dialektem zapytania - nie jest bezpośrednio językiem mutacji.

Aby zmienić wartości istniejącego słownika foreach jest chyba twoim przyjacielem:

foreach(int key in dictionary.Keys) { 
    dictionary[key] = 1; 
} 
+0

Czy nie byłoby miło, gdyby był to także język mutacji? –

+3

To jest to, co to jest ... –

+1

Daje to błąd runtime dotyczący zmiany kolekcji podczas wyliczenia i że pętla foreach nie może być kontynuowana. – pauldoo

2
foreach (var item in dictionary.Keys) 
    dictionary[item] = 1; 

Zastanawiam się dlaczego może potrzeba robić coś takiego, choć.

+0

Było to nadmierne uproszczenie. –

Powiązane problemy