Chọn một từ điển <T1, T2> với LINQ


171

Tôi đã sử dụng từ khóa "select" và phương thức mở rộng để trả về một IEnumerable<T>LINQ, nhưng tôi có nhu cầu trả lại một cái chung Dictionary<T1, T2>và không thể tìm ra nó. 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 hình thức tương tự như sau:

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ả sử rằng các mục trong một Dictionary<T1, T2>có thể được lặp đi lặp lại vì KeyValuePair<T1, T2>tôi chỉ có thể thay thế "Một số kính" trong ví dụ trên bằng " new KeyValuePair<T1, T2> { ...", nhưng nó 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 là có thể, hay tôi cần phải làm điều này trong nhiều bước?

Cảm ơn.

Câu trả lời:


284

Các phương thức tiện ích mở rộng cũng cung cấp tiện ích mở rộng ToDipedia . Nó khá đơn giản để sử dụng, cách sử dụng chung là truyền một bộ chọn lambda cho khóa và lấy đối tượng làm giá trị, nhưng bạn có thể chuyển 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]sẽ chứa giá trị "Xin chào"


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

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


27
.ToDictionary(item => item.prop1, item => item.prop2);để khám phá thiết lập giá trị quá.
Finoutlook

42

Một bộ sưu tập KeyValuePairthậm chí còn rõ ràng hơn, và thực hiện 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ó thể xóa .ToDixi (x => x.Key, x => x.Value); và thay thế KeyValuePair mới bằng Từ điển mới?
Amir Hajiha

@ AmirNo-Family Bạn đang nhầm. Chọn phương thức (x => x ...) thực hiện phép chiếu cho từng phần tử của bộ sưu tập đối tượng . Vì vậy, việc thay thế KeyValuePair mới bằng từ điển mới sẽ tạo ra một từ điển từ điển. Tôi không nghĩ đó là những gì bạn đang nhắm đến.
Antoine Meltzheim

Tôi có một danh sách Từ điển <chuỗi, chuỗi> và đang cố sử dụng select trên chúng nhưng nó gây ra lỗi biên dịch.
Amir Hajiha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.