Asigne dos listas a un diccionario en C #

Dado dos IEnumerable s del mismo tamaño, ¿cómo puedo convertirlo a un Dictionary usando Linq?

 IEnumerable keys = new List() { "A", "B", "C" }; IEnumerable values = new List() { "Val A", "Val B", "Val C" }; var dictionary = /* Linq ? */; 

Y el resultado esperado es:

 A: Val A B: Val B C: Val C 

Me pregunto si hay alguna manera simple de lograrlo.

¿Y debería preocuparme por el rendimiento? ¿Qué pasa si tengo grandes colecciones?


No lo hago si hay una manera más fácil de hacerlo, actualmente estoy haciendo esto:

Tengo un método de extensión que repetirá el IEnumerable proporcionándome el elemento y el número de índice.

 public static class Ext { public static void Each(this IEnumerable els, Action a) { int i = 0; foreach (T e in els) { a(e, i++); } } } 

Y tengo un método que repetirá uno de los Enumerables y con el índice recuperará el elemento equivalente en el otro enumerable.

 public static Dictionary Merge(IEnumerable keys, IEnumerable values) { var dic = new Dictionary(); keys.Each((x, i) => { dic.Add(x, values.ElementAt(i)); }); return dic; } 

Entonces lo uso como:

 IEnumerable keys = new List() { "A", "B", "C" }; IEnumerable values = new List() { "Val A", "Val B", "Val C" }; var dic = Util.Merge(keys, values); 

Y la salida es correcta:

 A: Val A B: Val B C: Val C 

Con .NET 4.0 (o la versión 3.5 de System.Interactive de Rx), puede usar Zip() :

 var dic = keys.Zip(values, (k, v) => new { k, v }) .ToDictionary(x => xk, x => xv); 

O, según su idea, LINQ incluye una sobrecarga de Select() que proporciona el índice. Combinado con el hecho de que los values admiten el acceso por índice, uno podría hacer lo siguiente:

 var dic = keys.Select((k, i) => new { k, v = values[i] }) .ToDictionary(x => xk, x => xv); 

(Si los values se mantienen como List , eso es …)

Me gusta este enfoque:

 var dict = Enumerable.Range(0, keys.Length).ToDictionary(i => keys[i], i => values[i]); 

Si usa MoreLINQ , también puede utilizar su método de extensión ToDictionary en KeyValuePair s creado anteriormente:

 var dict = Enumerable .Zip(keys, values, (key, value) => KeyValuePair.Create(key, value)) .ToDictionary(); 

También se debe tener en cuenta que el uso del método de extensión Zip es seguro contra las colecciones de entrada de diferentes longitudes.