valores valor recorrer obtener modificar llenar iterar ejemplos diccionario c# .net generics dictionary

recorrer - ¿Cuál es la mejor manera de establecer todos los valores en un diccionario de C#<string, bool>?



obtener valores de un dictionary c# (7)

¿Cuál es la mejor manera de establecer todos los valores en un Diccionario C #?

Esto es lo que estoy haciendo ahora, pero estoy seguro de que hay una manera mejor / más limpia de hacer esto:

Dictionary<string,bool> dict = GetDictionary(); var keys = dict.Keys.ToList(); for (int i = 0; i < keys.Count; i++) { dict[keys[i]] = false; }

He intentado algunas otras formas con foreach, pero tuve errores.


Ese es un enfoque razonable, aunque preferiría:

foreach (var key in dict.Keys.ToList()) { dict[key] = false; }

La llamada a ToList() hace que esto funcione, ya que se está retirando y (temporalmente) guardando la lista de claves, de modo que la iteración funciona.



He perfilado la diferencia entre las soluciones de Billy y Reed. Polaris878, tome buena nota de los resultados y recuerde que la optimización prematura es la raíz de todo mal ;-)

Reescribí las soluciones en VB (porque actualmente estoy programando en ese lenguaje) y usé las teclas int (por simplicidad), de lo contrario es exactamente el mismo código. Ejecuté el código con un diccionario de 10 millones de entradas con un valor de "verdadero" para cada entrada.

La solución original de Billy Witch Doctor:

Dim keys = dict.Keys.ToList For i = 0 To keys.Count - 1 dict(keys(i)) = False Next

Milisegundos transcurridos: 415

La solución de Reed Copsey:

For Each key In dict.Keys.ToList dict(key) = False Next

Milisegundos transcurridos: 395

Así que en ese caso el foreach es en realidad más rápido .


No estoy seguro de si es la mejor manera, pero estaba buscando algo en una sola línea y esto funcionó para mí.

mydict.Keys.ToList().ForEach(k => mydict[k] = false);


Puede simplemente sacar la Lista de Toques () e iterar directamente sobre los elementos del diccionario.

Dictionary<string, bool> dict = GetDictionary(); foreach (var pair in dict) { dict[pair.Key] = false; }


Si no está utilizando bools de tres estados, puede usar HashSet<string> y llamar a Clear() para establecer los valores en "falso".


Una solución de una línea:

dict = dict.ToDictionary(p => p.Key, p => false);