8 formas de iterar sobre pares de valores clave de diccionario en C#
Para iterar los pares clave-valor del diccionario en C# utilice los siguientes métodos
- Usando el bucle de C#
foreach
- Iterar sólo sobre las claves del diccionario de C#
- Iterar sólo sobre los valores del diccionario de C#
- Usando
Deconstruct
deKeyValuePair<TKey,TValue>
en C# 7 - Uso de
Deconstruct
ydiscards
en C# 7 Deconstruct
del par clave-valor en versiones antiguas de C#- Utilizando la función
dictionary.ElementAt()
y el buclefor
- Usando C#
dictionary.AsParallel().ForAll()
Veamos un ejemplo para entenderlo mejor
He creado un diccionario de ejemplo usando C#
for loop
Echa un vistazo al siguiente diccionario C#
var dictionaryExample = new Dictionary<string, string>();
for (var i = 1; i <= 5; i++)
{
dictionaryExample["key" + i] = "value" + i.ToString();
}
On this page
Solución 1: Utilizar el bucle C# foreach
El uso del bucle C# foreach
es la forma más sencilla y directa de iterar sobre los valores de las claves del diccionario en C#.
foreach (var dictionary in dictionaryExample)
{
Console.WriteLine("dictionary key is {0} and value is {1}", dictionary.Key, dictionary.Value);
}
//OUTPUT
dictionary key is key1 and value is value1
dictionary key is key2 and value is value2
dictionary key is key3 and value is value3
dictionary key is key4 and value is value4
dictionary key is key5 and value is value5
La variable dictionary
en el bucle anterior foreach
tendrá KeyValuePair<TKey, TValue>
tipo
Podemos acceder fácilmente a las propiedades Key
y Value
del tipo KeyValuePair
.
Solución 2: Iterar sólo sobre las claves del diccionario C#
Si quieres hacer un bucle sólo sobre las claves del diccionario utiliza la propiedad del diccionario de C# dictionary.Keys
.
foreach(var key in dictionaryExample.Keys)
{
Console.WriteLine("dictionary Key is {0}",key);
}
Solución 3: Iterar sólo sobre los valores del diccionario C#
Si quiere iterar sólo sobre los valores del diccionario utilice la propiedad del diccionario C# dictionary.Values
.
foreach (var value in dictionaryExample.Values)
{
Console.WriteLine("dictionary Value is {0}", value);
}
Solución 4: Usando Deconstruct()
de KeyValuePair<TKey,TValue>
en C# 7
Los deconstructores se introducen en la versión C# 7.0.
Y si estás usando la aplicación .NET Core 2.0+ el tipo KeyValuePair<TKey, TValue>
tendrá el método Deconstruct()
.
public readonly struct KeyValuePair<TKey, TValue>
{
private readonly TKey key;
private readonly TValue value;
private readonly int _dummyPrimitive;
public TKey Key
{
get
{
throw null;
}
}
public TValue Value
{
get
{
throw null;
}
}
public KeyValuePair(TKey key, TValue value)
{
throw null;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public void Deconstruct(out TKey key, out TValue value)
{
throw null;
}
public override string ToString()
{
throw null;
}
}
Para acceder al par clave-valor del diccionario utilice la función Deconstruct()
del tipo KeyValuePair
.
foreach (var (key,value) in dictionaryExample)
{
Console.WriteLine("dictionary key is {0} and value is {1}", key, value);
}
Solución 5: Uso de Deconstruct
y discards
en C# 7
A partir de C# 7.0, C# soporta descartes
Los descartes son variables de marcador de posición que no se utilizan intencionadamente en el código de la aplicación
A menudo se conocen como variables de guión bajo _
.
Los descartes no son más que las variables no asignadas, no tienen un valor.
En el diccionario si se quiere hacer un bucle sólo de Claves, podemos hacer uso de las variables de descarte.
foreach (var (key, _) in dictionaryExample)
{
Console.WriteLine($"dictionary key is {key}");
}
Del mismo modo si se quiere utilizar sólo los valores del diccionario.
foreach (var (_, value) in dictionaryExample)
{
Console.WriteLine($"dictionary value is {value}");
}
Solución 6: Deconstruct
de par clave-valor en versiones antiguas de C#
La estructura KeyValuePair no tiene la función Deconstruct()
en versiones antiguas de C#.(C# 4.7.2 abajo)
Así que si quieres usar Deconstruct()
para hacer un bucle de pares clave-valor hay una solución
foreach (var (key, value) in dictionaryExample.Select(x => (x.Key, x.Value)))
{
Console.WriteLine("dictionary key is {0} and value is {1}", key, value);
}
En la mayoría de los casos no usaremos este método, pero es bueno saberlo.
Solución 7: Usando la función dictionary.ElementAt()
y el bucle for
Podemos utilizar el simple bucle for
para iterar sobre los pares clave-valor del diccionario.
Podemos acceder a los valores de KeyValuePair
por el índice del diccionario utilizando la función dictionary.ElementAt()
.
for(var i = 0; i < dictionaryExample.Count; i++)
{
var keyValuePair = dictionaryExample.ElementAt(i);
Console.WriteLine("dictionary key is {0} and value is {1}", keyValuePair.Key, keyValuePair.Value);
}
De nuevo no es una buena manera de hacer un bucle a través del diccionario, porque la función ElementAt()
tendrá O(n)
y nosotros tenemos el bucle for
arriba por lo que la complejidad de tiempo será O(n^2)
En diccionarios grandes tendrá implicaciones de rendimiento.
Si quieres obtener el índice de los pares clave-valor del diccionario utiliza este método
No se me ocurre ningún caso de uso en el mundo real en el que se utilice el índice del diccionario
Solución 8: Usando C# dictionary.AsParallel().ForAll()
Si tenemos un diccionario grande, podemos hacer uso de la consulta integrada en lenguaje paralelo (LINQ) utilizando el método de extensión ParallelEnumerable.AsParallel
en el diccionario y ejecutando la consulta mediante el método ParallelEnumerable.ForAll
.
La consulta particiona el origen en tareas que se ejecutan de forma asíncrona en múltiples hilos
dictionaryExample.AsParallel().ForAll(keyValuePair =>
Console.WriteLine("dictionary key is {0} and value is {1}", keyValuePair.Key, keyValuePair.Value));
La mejor manera de hacer un bucle en el diccionario en C#
Aunque tenemos múltiples formas de iterar sobre los valores de las claves de un diccionario, preferimos usar un simple bucle foreach
Y si quieres hacer un bucle sólo con las claves o valores del diccionario de C# utiliza dictionary.Keys
o dictionary.Values
en lugar de iterar todo el diccionario