8 formas de loop/alfabetizar pares de valores chave do dicionário em C#
Para iterar os pares de valores chave do dicionário em C#, utilize os seguintes métodos
- Usando o laço C#
foreach
- Iterate over C# dictionary key only
- Iterar apenas sobre os valores do dicionário C#
- Usando
Deconstruct
deKeyValuePair<TKey,TValue>
em C# 7 - Usando
Deconstruct
ediscards
em C# 7 Deconstruct
de par de valores chave em versões C# mais antigas- Usando a função
dictionary.ElementAt()
efor
loop - Usando C#
dictionary.AsParallel().ForAll()
Passemos por um exemplo para o compreender melhor
Criei um dicionário de amostras usando C#
para loop
Dê uma vista de olhos no dicionário abaixo C#
var dictionaryExample = new Dictionary<string, string>();
for (var i = 1; i <= 5; i++)
{
dictionaryExample["key" + i] = "value" + i.ToString();
}
On this page
}
Solução 1: Usando C# foreach
loop
A utilização do laço C# foreach
é a forma mais simples e directa de iterar sobre os valores chave do dicionário em 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
A variável dictionary
em cima foreach
loop terá KeyValuePair<TKey, TValue>
tipo
Podemos aceder facilmente a Key
& Value
propriedades do tipo KeyValuePair
.
Solução 2: Iterate over C# dictionary key only
Se quiser passar por cima apenas das chaves do dicionário, utilize a propriedade C# do dicionário dictionary.Keys
.
foreach(var key in dictionaryExample.Keys)
{
Console.WriteLine("dictionary Key is {0}",key);
}
Solução 3: Iterar apenas sobre os valores do dicionário C
Se quiser iterar apenas sobre valores do dicionário, utilize a propriedade C# dictionary.Values
do dicionário.
foreach (var value in dictionaryExample.Values)
{
Console.WriteLine("dictionary Value is {0}", value);
}
Solução 4: Usando Deconstruct()
de KeyValuePair<TKey,TValue>
em C# 7
Os desconstrutores são introduzidos na versão C# 7.0.
E se estiver a utilizar a aplicação .NET Core 2.0+ a KeyValuePair<TKey, TValue>
tipo terá o 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 aceder ao par de valores chave do dicionário, utilize a função Deconstruct()
do tipo KeyValuePair
.
foreach (var (key,value) in dictionaryExample)
{
Console.WriteLine("dictionary key is {0} and value is {1}", key, value);
}
Solução 5: Usando Deconstruct
e discards
em C# 7
Começando com C# 7.0, C# suporta descartes
Os descartes são variáveis de lugar reservado que são intencionalmente não utilizadas no código de aplicação
Muitas vezes referiam-se às variáveis _
.
Os descartes não são mais do que as variáveis não atribuídas, não têm um valor.
No dicionário, se quiser apenas fazer looping de chaves, podemos fazer uso de variáveis de descarte.
foreach (var (key, _) in dictionaryExample)
{
Console.WriteLine($"dictionary key is {key}");
}
Da mesma forma, se quiser utilizar apenas valores de dicionário.
foreach (var (_, value) in dictionaryExample)
{
Console.WriteLine($"dictionary value is {value}");
}
Solução 6: Deconstruct
do par de valores chave em versões C# mais antigas
A estrutura KeyValuePair não tem a função Deconstruct()
nas versões mais antigas do C#.(C# 4.7.2 abaixo)
Assim, se quiser usar Deconstruct()
para fazer o loop de pares de valores chave, há uma solução alternativa
foreach (var (key, value) in dictionaryExample.Select(x => (x.Key, x.Value)))
{
Console.WriteLine("dictionary key is {0} and value is {1}", key, value);
}
Na maioria dos casos não vamos utilizar este método, mas é bom saber.
Solução 7: Usando a função dictionary.ElementAt()
e for
loop
Podemos utilizar o simples laço for
para iterar sobre os pares de valores chave do dicionário.
Podemos aceder aos valores KeyValuePair
através do índice de dicionário usando a função 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);
}
Mais uma vez, não é uma boa maneira de fazer loop through dicionário, porque a função ElementAt()
terá O(n)
e temos for
loop above, pelo que a complexidade temporal será O(n^2)
Em grandes dicionários, terá implicações de desempenho.
Se quiser obter o índice dos pares de valores chave do Dicionário, utilize este método
Não penso em nenhum caso de uso do mundo real onde o índice do dicionário será utilizado
Solução 8: Usando C# dictionary.AsParallel().ForAll()
Se tiver um dicionário grande, podemos fazer uso da consulta Parallel Language Integrated Query (LINQ) usando o método de extensão ParallelEnumerable.AsParallel
no dicionário e executando a consulta usando o método ParallelEnumerable.ForAll
.
A consulta divide a fonte em tarefas que são executadas de forma assíncrona em vários fios
dictionaryExample.AsParallel().ForAll(keyValuePair =>
Console.WriteLine("dictionary key is {0} and value is {1}", keyValuePair.Key, keyValuePair.Value));
A melhor maneira de fazer o dicionário em C#
Embora tenhamos múltiplas formas de iterar sobre os valores chave de um dicionário, preferimos usar um simples laço de testa
E se quiser apenas o dicionário C#, use dictionary.Keys
ou dictionary.Values
em vez de iterar todo o dicionário