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");
learnerplates
fonte
Possível duplicado? stackoverflow.com/questions/7850334/…
Coolkau

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.

Jon Skeet
fonte
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