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.
Hazlo como lo tienes ahora mismo ... porque cada uno es lento. Foreach puede ser más limpio, pero usas demasiado el rendimiento.
Editar:
http://www.codeproject.com/KB/cs/foreach.aspx
http://www.madprops.org/blog/for-vs-foreach-performance/
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);