8 způsobů, jak v jazyce C# vytvořit smyčku/iterovat dvojice klíč-hodnota slovníku
Pro iteraci dvojic klíč-hodnota slovníku v jazyce C# použijte následující metody
- Pomocí smyčky v jazyce C#
foreach
- Iterace pouze nad klíči slovníku C#
- Iterovat pouze nad hodnotami slovníku C#
- Použití
Deconstruct
zKeyValuePair<TKey,TValue>
v C# 7 - Použití
Deconstruct
adiscards
v jazyce C# 7 Deconstruct
dvojice klíč-hodnota ve starších verzích jazyka C#- Použití funkce
dictionary.ElementAt()
a smyčkyfor
- Použití funkce
dictionary.AsParallel().ForAll()
v jazyce C#
Projděme si příklad, abychom jej lépe pochopili
Vytvořil jsem ukázkový slovník pomocí C#
for cyklu
Podívejte se na níže uvedený slovník C#
var dictionaryExample = new Dictionary<string, string>();
for (var i = 1; i <= 5; i++)
{
dictionaryExample["key" + i] = "value" + i.ToString();
}
On this page
Řešení 1: Použití smyčky C# foreach
Použití smyčky C# foreach
je nejjednodušší a nejpřímočařejší způsob iterace přes hodnoty klíčů slovníku v jazyce 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
Proměnná dictionary
ve výše uvedeném cyklu foreach
bude mít hodnotu KeyValuePair<TKey, TValue>
typ
K vlastnostem Key
& Value
typu KeyValuePair
můžeme snadno přistupovat.
Řešení 2: Iterace pouze nad klíči slovníku C#
Pokud chcete procházet ve smyčce pouze klíče slovníku, použijte vlastnost slovníku C# dictionary.Keys
.
foreach(var key in dictionaryExample.Keys)
{
Console.WriteLine("dictionary Key is {0}",key);
}
Řešení 3: Iterujte pouze nad hodnotami slovníku C#
Pokud chcete iterovat pouze nad slovníkovými hodnotami, použijte vlastnost C# dictionary dictionary.Values
.
foreach (var value in dictionaryExample.Values)
{
Console.WriteLine("dictionary Value is {0}", value);
}
Řešení 4: Použití Deconstruct()
z KeyValuePair<TKey,TValue>
v jazyce C# 7
Dekonstruktory jsou zavedeny ve verzi C# 7.0.
A pokud používáte aplikaci .NET Core 2.0+ KeyValuePair<TKey, TValue>
typ bude mít metodu 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;
}
}
Pro přístup k dvojici klíč-hodnota slovníku použijte funkci Deconstruct()
typu KeyValuePair
.
foreach (var (key,value) in dictionaryExample)
{
Console.WriteLine("dictionary key is {0} and value is {1}", key, value);
}
Řešení 5: Použití Deconstruct
a discards
v jazyce C# 7
Počínaje verzí C# 7.0 podporuje jazyk C# odhazování
Discardy jsou zástupné proměnné, které se v kódu aplikace záměrně nepoužívají
Často se označují jako proměnné s podtržítkem _
.
Discards nejsou nic jiného než nepřiřazené proměnné, nemají žádnou hodnotu.
Pokud chceme ve slovníku zacyklit pouze Klíče, můžeme využít odhazovací proměnné.
foreach (var (key, _) in dictionaryExample)
{
Console.WriteLine($"dictionary key is {key}");
}
Podobně pokud chceme použít pouze hodnoty slovníku.
foreach (var (_, value) in dictionaryExample)
{
Console.WriteLine($"dictionary value is {value}");
}
Řešení 6: Deconstruct
dvojice klíč-hodnota ve starších verzích jazyka C#
Struct KeyValuePair nemá ve starších verzích jazyka C# funkci Deconstruct()
(C# 4.7.2 níže)
Pokud tedy chcete použít Deconstruct()
pro zacyklení dvojic klíčů a hodnot, existuje řešení
foreach (var (key, value) in dictionaryExample.Select(x => (x.Key, x.Value)))
{
Console.WriteLine("dictionary key is {0} and value is {1}", key, value);
}
Ve většině případů tuto metodu nebudeme používat, ale je dobré ji znát.
Řešení 7: Použití funkce dictionary.ElementAt()
a smyčky for
K iteraci nad dvojicemi klíč-hodnota slovníku můžeme použít jednoduchou smyčku for
.
K hodnotám KeyValuePair
můžeme přistupovat pomocí indexu slovníku pomocí funkce 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);
}
Opět to není dobrý způsob, jak procházet slovník, protože funkce ElementAt()
bude mít O(n)
a my máme výše for
smyčku, takže časová složitost bude O(n^2)
U velkých slovníků to bude mít dopad na výkon.
Pokud chcete získat index dvojic klíč-hodnota slovníku, použijte tuto metodu
Nenapadá mě žádný reálný případ použití, kdy by se index slovníku používal
Řešení 8: Použití jazyka C# dictionary.AsParallel().ForAll()
Pokud máme k dispozici velký slovník, můžeme využít dotazu LINQ (Parallel Language Integrated Query) tak, že na slovníku použijeme rozšiřující metodu ParallelEnumerable.AsParallel
a dotaz provedeme pomocí metody ParallelEnumerable.ForAll
.
Dotaz rozdělí zdroj na úlohy, které se provádějí asynchronně ve více vláknech
dictionaryExample.AsParallel().ForAll(keyValuePair =>
Console.WriteLine("dictionary key is {0} and value is {1}", keyValuePair.Key, keyValuePair.Value));
Nejlepší způsob, jak zacyklit slovník v jazyce C#
I když máme více způsobů, jak iterovat přes hodnoty klíčů slovníku, raději použijte jednoduchý cyklus foreach
A pokud chcete zacyklit pouze klíče nebo hodnoty slovníku C#, použijte místo iterace celého slovníku dictionary.Keys
nebo dictionary.Values