2010-03-12 13 views
14

Estoy tratando de crear un diccionario a partir de 2 listas donde una lista contiene claves y una lista contiene valores. Puedo hacerlo usando for loop pero estoy tratando de encontrar si hay una manera de hacerlo usando LINQ. El código de muestra será útil. ¡¡¡¡Gracias!!!!crear un diccionario usando 2 listas usando LINQ

Respuesta

38

En .NET4 usted podría utilizar el incorporado en Zip método para fusionar las dos secuencias, seguido de una llamada ToDictionary:

var keys = new List<int> { 1, 2, 3 }; 
var values = new List<string> { "one", "two", "three" }; 

var dictionary = keys.Zip(values, (k, v) => new { Key = k, Value = v }) 
        .ToDictionary(x => x.Key, x => x.Value); 
20
 List<string> keys = new List<string>(); 
     List<string> values = new List<string>(); 
     Dictionary<string, string> dict = keys.ToDictionary(x => x, x => values[keys.IndexOf(x)]); 

Por supuesto, esto supone que la longitud de cada lista es la misma y que las claves son únicas.

ACTUALIZACIÓN:This answer es mucho más eficiente y se debe utilizar para listas de tamaño no trivial.

+0

prefiero usar un bucle, en lugar de utilizar esto. Todavía +1 para la respuesta. – Steven

+0

Eso fue todo. ¡¡¡Gracias!!! – VNarasimhaM

+0

¿por qué usaría loops en lugar de LINQ? Pensé que este código es mucho más sucinta y legible que el ciclo for. – VNarasimhaM

4

Puede incluir el índice en una expresión Select Para que esto sea eficaz:

 var a = new List<string>() { "A", "B", "C" }; 
     var b = new List<string>() { "1", "2", "3" }; 

     var c = a.Select((x, i) => new {key = x, value = b[i]}).ToDictionary(e => e.key, e => e.value); 

     foreach (var d in c) 
      Console.WriteLine(d.Key + " = " + d.Value); 

     Console.ReadKey(); 
-3

Puede usar este código y funcionar perfectamente.

C# Código:

var keys = new List<string> { "Kalu", "Kishan", "Gourav" }; 
     var values = new List<string> { "Singh", "Paneri", "Jain" }; 

     Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
     for (int i = 0; i < keys.Count; i++) 
     { 

      dictionary.Add(keys[i].ToString(), values[i].ToString()); 
     } 
     foreach (var data in dictionary) 
     { 
      Console.WriteLine("{0} {1}", data.Key, data.Value); 

     } 
     Console.ReadLine(); 

Salida de pantalla:

enter image description here

+0

Una tarea demasiado engorrosa – netfed

1
var dic = keys.Zip(values, (k, v) => new { k, v }) 
      .ToDictionary(x => x.k, x => x.v); 
+2

¿Esto realmente agrega algo a [LukeH] (http://stackoverflow.com/users/55847/lukeh) [respuesta de 5 años] (http://stackoverflow.com/a/ 2434647/215380)? – Rawling