2009-06-04 8 views

Répondre

4

Ceci est loin d'être aussi clair que d'autres moyens, mais il devrait fonctionner correctement:

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

Mon autre alternative aurait été de faire une méthode d'extension ForEach semblable à ceci:

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

Ensuite, utilisez-le comme ceci:

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

Cela ne fonctionnera pas dans ce cas, car la valeur ne peut pas être aussi signé à.

+0

Donc, fondamentalement, je n'utiliserais jamais le premier morceau de code dans la réalité. La méthode d'extension peut être excellente, mais comme la valeur ne peut pas être affectée, les dictionnaires ne permettent pas beaucoup. –

+1

Pas aussi clair * et * moins efficace (crée une liste clonée des clés, et fait 2 itérations au lieu de 1) ... un gagnant! –

4

LINQ est un dialecte de requête - ce n'est pas directement un langage de mutation.

Pour modifier les valeurs d'un dictionnaire existant, foreach est probablement votre ami:

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

Ne serait-ce pas bien si c'était aussi un langage de mutation? –

+3

C'est ce que c'est ... –

+1

Cela donne une erreur d'exécution au sujet de la modification de la collection au cours de l'énumération, et que la boucle foreach ne peut pas continuer. – pauldoo

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

Je me demande pourquoi vous pourriez besoin de faire une telle chose, cependant.

+0

C'était une simplification excessive. –

Questions connexes