2009-03-06 33 views
138

Tôi đã sử dụng từ khóa "chọn" và phương pháp mở rộng để trả về một IEnumerable<T> với LINQ, nhưng tôi có nhu cầu trả lại một số chung chung Dictionary<T1, T2> và không thể tìm ra. Ví dụ tôi đã học được điều này từ việc sử dụng một cái gì đó trong một biểu mẫu tương tự như sau:Chọn từ điển <T1, T2> với LINQ

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 }; 

Tôi cũng làm điều tương tự với các phương pháp mở rộng. Tôi giả định rằng vì các mục trong một Dictionary<T1, T2> có thể được lặp lại thành KeyValuePair<T1, T2> mà tôi chỉ có thể thay thế "SomeClass" trong ví dụ trên với "new KeyValuePair<T1, T2> { ...", nhưng điều đó không hoạt động (Khóa và Giá trị được đánh dấu là chỉ đọc, vì vậy tôi không thể biên dịch mã này).

Điều này có thể xảy ra không hoặc tôi có cần thực hiện việc này trong nhiều bước không?

Cảm ơn.

Trả lời

221

Các phương pháp tiện ích cũng cung cấp tiện ích mở rộng ToDictionary. Nó là khá đơn giản để sử dụng, việc sử dụng chung là đi qua một bộ chọn lambda cho khóa và nhận được đối tượng như giá trị, nhưng bạn có thể vượt qua một bộ chọn lambda cho cả khóa và giá trị.

class SomeObject 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

SomeObject[] objects = new SomeObject[] 
{ 
    new SomeObject { ID = 1, Name = "Hello" }, 
    new SomeObject { ID = 2, Name = "World" } 
}; 

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name); 

Sau đó objectDictionary[1] có chứa giá trị "Hello"

+3

+1 Whuh. Điều này mở ra những khả năng mới về cách tôi tiếp cận tạo các đối tượng dữ liệu mới. – Sung

+1

Tuyệt vời, vui vì bạn sẽ sử dụng nó, tôi biết điều đó đã giúp tôi trong một số trường hợp. –

+2

Egads! Bây giờ là năm 2017 và tôi chỉ mới phát hiện ra điều này !! –

34
var dictionary = (from x in y 
        select new SomeClass 
        { 
         prop1 = value1, 
         prop2 = value2 
        } 
       ).ToDictionary(item => item.prop1); 

Đó là giả định rằng SomeClass.prop1 là mong muốn Key cho từ điển.

+21

'.ToDictionary (item => item.prop1, item => item.prop2);' để explicity đặt giá trị quá. – finoutlook

11

Bộ sưu tập KeyValuePair thậm chí còn rõ ràng hơn và thực thi rất tốt.

Dictionary<int, string> dictionary = objects 
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name)) 
    .ToDictionary(x=>x.Key, x=>x.Value); 
Các vấn đề liên quan