2009-06-04 23 views

Respuesta

4

Esto no es tan clara como otras maneras, pero que debería funcionar bien:

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

Mi otra alternativa hubiera sido hacer un método de extensión ParaCada similar a esto:

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

Luego úsela así:

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

Esto no funcionará en este caso, ya que Value no puede ser tan firmado a.

+0

Así que, básicamente, nunca usaría el primer código en realidad. El método de extensión puede ser excelente, pero como no se puede asignar el valor, los diccionarios no permiten mucho. –

+1

No tan claro * y * menos eficiente (crea una lista clonada de las claves, y realiza 2 iteraciones en lugar de 1) ... ¡un ganador! –

4

LINQ es un dialecto de consulta, no es directamente un lenguaje de mutación.

Para cambiar los valores de un diccionario existente, foreach es probablemente su amigo:

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

¿No sería bueno si también fuera un lenguaje de mutación? –

+3

Es lo que es ... –

+1

Esto da un error de tiempo de ejecución sobre el cambio de colección durante la enumeración, y que el bucle foreach no puede continuar. – pauldoo

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

Me pregunto qué es posible que la necesidad de hacer tal cosa, sin embargo.

+0

Fue una simplificación excesiva. –

Cuestiones relacionadas