Recreando un diccionario desde un IEnumerable <KeyValuePair <>>


173

Tengo un método que devuelve un IEnumerable<KeyValuePair<string, ArrayList>>, pero algunas de las personas que llaman requieren que el resultado del método sea un diccionario. ¿Cómo puedo convertir el IEnumerable<KeyValuePair<string, ArrayList>>en un Dictionary<string, ArrayList>para que pueda usar TryGetValue?

método:

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

llamador:

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

Respuestas:


329

Si está usando .NET 3.5 o .NET 4, es fácil crear el diccionario usando LINQ:

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

No existe tal cosa como un IEnumerable<T1, T2>pero KeyValuePair<TKey, TValue>está bien.


15
Pensarías que habría una llamada que no requiere argumentos, dado que Dictionary <TKey, TValue> implementa IEnumerable <KeyValuePair <TKey, TValue >>, pero bueno. Lo suficientemente fácil como para hacer el tuyo.
Casey

66
@DanVerdolino lo sé. Pensarías eso porque es una de las cosas más comunes que querrás hacer con un IEnumerable de KVP.
Casey

17
2016 ahora, y todavía tenía que googlear esto. Uno pensaría que habría un constructor para Dictionaryeso tomó un IEnumerable<KeyValuePair<TKey, TValue>>igual que List<T>toma a IEnumerable<T>. Además, no hay AddRangeni siquiera Addeso que toma pares clave / valor. ¿Que pasa con eso?
die maus

55
¡Es 2017 ahora, y podemos agregar esto como un método de extensión!
Chris Bush

2
Gran parte de "No puedo creer que .net core no tenga <característica obvia>" se resuelve a través de MoreLinq . Incluyendo un IEnumerable sin parámetros <KeyValuePair> ->ToDictionary()
aaaaaa

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.