Recriando um dicionário de um IEnumerable <KeyValuePair <>>


172

Eu tenho um método que retorna um IEnumerable<KeyValuePair<string, ArrayList>>, mas alguns dos chamadores exigem que o resultado do método seja um dicionário. Como converter o IEnumerable<KeyValuePair<string, ArrayList>>em um Dictionary<string, ArrayList>para que eu possa usar TryGetValue?

método:

public IEnumerable<KeyValuePair<string, ArrayList>> GetComponents()
{
  // ...
  yield return new KeyValuePair<string, ArrayList>(t.Name, controlInformation);
}

chamador:

Dictionary<string, ArrayList> actual = target.GetComponents();
actual.ContainsKey("something");

Respostas:


328

Se você estiver usando o .NET 3.5 ou .NET 4, é fácil criar o dicionário usando o LINQ:

Dictionary<string, ArrayList> result = target.GetComponents()
                                      .ToDictionary(x => x.Key, x => x.Value);

Não existe, IEnumerable<T1, T2>mas a KeyValuePair<TKey, TValue>está bem.


15
Você pensaria que haveria uma chamada que não requer argumentos, dado que o Dictionary <TKey, TValue> implementa IEnumerable <KeyValuePair <TKey, TValue >>, mas tudo bem. Fácil o suficiente para fazer o seu próprio.
Casey

6
@DanVerdolino Eu sei disso. Você pensaria isso porque é uma das coisas mais comuns que você pode querer fazer com um IEnumerable de KVPs.
Casey

17
2016 agora, e eu ainda tinha que pesquisar no google. Você pensaria que haveria um construtor para Dictionaryque tomou uma IEnumerable<KeyValuePair<TKey, TValue>>tal como List<T>leva um IEnumerable<T>. Também não há AddRangeou mesmo Addque leva pares de chave / valor. O que há com isso?
die maus

5
Agora é 2017 e podemos adicionar isso como um método de extensão!
Chris Bush

2
Muitos "Não acredito que o núcleo .net não possui <recurso óbvio>" são resolvidos pelo MoreLinq . Incluindo um IEnumerable sem parâmetros <KeyValuePair> ->ToDictionary()
aaaaaa

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.