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");
placas de aprendizaje
fuente
Posible duplicado? stackoverflow.com/questions/7850334/…
Coolkau

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.

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