2010-03-12 26 views
14

Tôi đang cố gắng tạo một từ điển từ 2 danh sách trong đó một danh sách chứa các khóa và một danh sách chứa các giá trị. Tôi có thể làm điều đó bằng cách sử dụng cho vòng lặp nhưng tôi đang cố gắng tìm nếu có một cách để làm điều đó bằng cách sử dụng LINQ. Mã mẫu sẽ hữu ích. Cảm ơn!!!!tạo một từ điển bằng cách sử dụng 2 danh sách bằng LINQ

Trả lời

38

Trong .NET4 bạn có thể sử dụng được xây dựng trong Zip phương pháp để hợp nhất hai chuỗi, tiếp theo là một cuộc gọi 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)]); 

Điều này tất nhiên giả định rằng độ dài của mỗi danh sách giống nhau và các phím là duy nhất.

CẬP NHẬT:This answer hiệu quả hơn nhiều và nên được sử dụng cho các danh sách có kích thước không nhỏ.

+0

Tôi muốn sử dụng một vòng lặp, thay vì sử dụng này. Vẫn +1 cho câu trả lời. – Steven

+0

Đó là nó. Cảm ơn!!! – VNarasimhaM

+0

tại sao bạn sử dụng vòng lặp thay vì LINQ? Tôi nghĩ rằng mã này là rất nhiều succint và dễ đọc hơn so với vòng lặp for. – VNarasimhaM

4

Bạn có thể bao gồm các chỉ số trong một biểu thức Select để làm điều này hiệu quả:

 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

Bạn có thể sử dụng mã này và hoạt động hoàn hảo.

C# Code:

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(); 

Output màn hình:

enter image description here

+0

Quá cồng kềnh một nhiệm vụ – netfed

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

Điều này có thực sự thêm bất kỳ thứ gì vào câu trả lời [5 tuổi của [LukeH] (http://stackoverflow.com/users/55847/lukeh) hay không (http://stackoverflow.com/a/) 2434647/215380)? – Rawling

Các vấn đề liên quan