8 façons de boucler/itérer des paires clé-valeur de dictionnaire en C#
Pour itérer les paires clé-valeur du dictionnaire en C#, utilisez les méthodes suivantes
- Utilisation de la boucle C#
foreach
- Itération sur les clés du dictionnaire C# uniquement
- Itération sur les valeurs du dictionnaire C# uniquement
- Utilisation de
Deconstruct
deKeyValuePair<TKey,TValue>
en C# 7 - Utilisation de
Deconstruct
etdiscards
en C# 7 Deconstruct
de la paire clé-valeur dans les anciennes versions de C#- Utilisation de la fonction
dictionary.ElementAt()
et de la bouclefor
- Utilisation de C#
dictionary.AsParallel().ForAll()
Prenons un exemple pour mieux comprendre
J’ai créé un exemple de dictionnaire en utilisant la boucle for C#
Jetez un coup d’oeil au dictionnaire ci-dessous C#
var dictionaryExample = new Dictionary<string, string>();
for (var i = 1; i <= 5; i++)
{
dictionaryExample["key" + i] = "value" + i.ToString();
}
On this page
Solution 1 : Utilisation de la boucle C# foreach
L’utilisation de la boucle C# foreach
est le moyen le plus simple et le plus direct d’itérer sur les valeurs des clés d’un dictionnaire 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
dans la boucle foreach
ci-dessus sera de KeyValuePair<TKey, TValue>
type
Nous pouvons facilement accéder aux propriétés Key
& Value
du type KeyValuePair
.
Solution 2 : Itérer sur les clés du dictionnaire C# uniquement
Si vous souhaitez effectuer une boucle uniquement sur les clés du dictionnaire, utilisez la propriété dictionary.Keys
du dictionnaire C#.
foreach(var key in dictionaryExample.Keys)
{
Console.WriteLine("dictionary Key is {0}",key);
}
Solution 3 : Itération sur les valeurs du dictionnaire C# uniquement
Si vous souhaitez itérer uniquement sur les valeurs du dictionnaire, utilisez la propriété C# dictionary dictionary.Values
.
foreach (var value in dictionaryExample.Values)
{
Console.WriteLine("dictionary Value is {0}", value);
}
Solution 4 : Utilisation de Deconstruct()
de KeyValuePair<TKey,TValue>
en C# 7
Les déconstructeurs sont introduits dans la version C# 7.0.
Et si vous utilisez l’application .NET Core 2.0+, le type KeyValuePair<TKey, TValue>
aura la méthode 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;
}
}
Pour accéder à la paire clé-valeur du dictionnaire, utilisez la fonction Deconstruct()
du type KeyValuePair
.
foreach (var (key,value) in dictionaryExample)
{
Console.WriteLine("dictionary key is {0} and value is {1}", key, value);
}
Solution 5 : Utilisation de Deconstruct
et discards
en C# 7
À partir de C# 7.0, C# prend en charge les rejets
Les rejets sont des variables de type placeholder qui sont intentionnellement inutilisées dans le code de l’application
Elles sont souvent appelées variables underscore _
.
Les discards ne sont rien d’autre que des variables non assignées, elles n’ont pas de valeur.
Dans le dictionnaire, si l’on veut boucler uniquement les clés, on peut utiliser les variables de rejet.
foreach (var (key, _) in dictionaryExample)
{
Console.WriteLine($"dictionary key is {key}");
}
De même si vous voulez utiliser uniquement les valeurs du dictionnaire.
foreach (var (_, value) in dictionaryExample)
{
Console.WriteLine($"dictionary value is {value}");
}
Solution 6 : Deconstruct
de la paire clé-valeur dans les anciennes versions de C#
La structure KeyValuePair ne dispose pas de la fonction Deconstruct()
dans les anciennes versions de C# (C# 4.7.2 ci-dessous)
Donc, si vous voulez utiliser Deconstruct()
pour boucler les paires clé-valeur, il existe une solution de contournement
foreach (var (key, value) in dictionaryExample.Select(x => (x.Key, x.Value)))
{
Console.WriteLine("dictionary key is {0} and value is {1}", key, value);
}
Dans la plupart des cas, nous n’utiliserons pas cette méthode, mais il est bon de le savoir.
Solution 7 : Utilisation de la fonction dictionary.ElementAt()
et de la boucle for
Nous pouvons utiliser la simple boucle for
pour itérer sur les paires clé-valeur du dictionnaire.
Nous pouvons accéder aux valeurs de KeyValuePair
par l’index du dictionnaire en utilisant la fonction 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);
}
Encore une fois, ce n’est pas une bonne façon de boucler à travers le dictionnaire, parce que la fonction ElementAt()
aura O(n)
et nous avons for
boucle ci-dessus donc la complexité du temps sera O(n^2)
Dans les grands dictionnaires, cela aura des conséquences sur les performances.
Si vous voulez obtenir l’index des paires clé-valeur du dictionnaire, utilisez cette méthode
Je ne pense pas qu’il y ait un cas d’utilisation réel où l’index du dictionnaire sera utilisé
Solution 8 : Utilisation de C# dictionary.AsParallel().ForAll()
Si vous avez un grand dictionnaire, nous pouvons utiliser la requête LINQ (Parallel Language Integrated Query) en utilisant la méthode d’extension ParallelEnumerable.AsParallel
sur le dictionnaire et en exécutant la requête à l’aide de la méthode ParallelEnumerable.ForAll
.
La requête divise la source en tâches qui sont exécutées de manière asynchrone sur plusieurs threads
dictionaryExample.AsParallel().ForAll(keyValuePair =>
Console.WriteLine("dictionary key is {0} and value is {1}", keyValuePair.Key, keyValuePair.Value));
Meilleure façon de boucler le dictionnaire en C#
Bien que nous ayons plusieurs façons d’itérer sur les valeurs des clés d’un dictionnaire, nous préférons utiliser la simple boucle foreach
Et si vous voulez boucler uniquement les clés ou les valeurs d’un dictionnaire C#, utilisez dictionary.Keys
ou dictionary.Values
au lieu d’itérer sur tout le dictionnaire