2009-06-04 2 views

Antwort

4

Dieses bei weitem nicht so klar wie andere Möglichkeiten, aber es sollte funktionieren:

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

Meine andere Alternative gewesen, eine ForEach-Extension-Methode ähnlich wie diese zu machen habe:

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

Dann verwenden Sie es wie folgt:

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

Dies wird jedoch in diesem Fall nicht funktionieren, da Wert nicht als sein kann unterschrieben an.

+0

Also im Grunde würde ich niemals das erste Stück Code in der Realität verwenden. Die Erweiterungsmethode kann groß sein, aber da Value nicht zugewiesen werden kann, erlauben Wörterbücher nicht viel. –

+1

Nicht so klar * und * weniger effizient (erstellt eine geklonte Liste der Schlüssel und macht 2 Iterationen statt 1) ​​... ein Gewinner! –

4

LINQ ist ein Query-Dialekt - es ist nicht direkt eine Mutationssprache.

Um die Werte eines bestehenden Wörterbuch zu ändern, ist foreach wahrscheinlich Freundes: obwohl

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

Wäre es nicht schön, wenn es auch eine Mutationssprache wäre? –

+3

Es ist, was es ist ... –

+1

Dies gibt einen Laufzeitfehler über die Auflistung während der Enumeration ändern, und dass die Foreach-Schleife nicht fortgesetzt werden kann. – pauldoo

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

Ich frage mich, warum Sie eine Notwendigkeit, so etwas zu tun.

+0

Es war eine Vereinfachung. –

Verwandte Themen