LINQ - Chuyển đổi danh sách thành từ điển với giá trị là danh sách


99

tôi có một

List<MyObject> 

mà tôi lấy từ cơ sở dữ liệu. Tuy nhiên, tôi muốn nó được khóa bởi một thuộc tính trong MyObject cho mục đích nhóm. Cách tốt nhất với LINQ để chuyển danh sách của tôi đến:

Dictionary<long, List<MyObject>>

Tôi có những thứ sau:

myObjectList.ToDictionary(x => x.KeyedProperty)

Nhưng nó trả về:

Dictionary<long, MyObject>

Bạn muốn từ điển được khóa vào một đề xuất WHICH MyObject? - bạn có một danh sách toàn bộ về chúng ....
James Curran

Câu trả lời:


191

Có vẻ như bạn muốn nhóm các MyObjectcá thể theo KeyedPropertyvà đặt nhóm đó vào a Dictionary<long,List<MyObject>>. Nếu vậy hãy thử cách sau

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());

16

Bạn nên sử dụng ToLookupphương thức mở rộng trên Enumerablelớp như sau:

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

Nếu bạn muốn đặt nó trong từ điển, thì bạn có thể sử dụng ToDictionaryphương thức mở rộng , như sau:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);

Sự khác biệt giữa câu trả lời này và câu trả lời được chấp nhận là gì? Liệu ILookupgiữ gìn tài liệu tham khảo trong khi câu trả lời được chấp nhận không?
PatPeter

@PatPeter Ý tưởng là khi bạn có mối quan hệ một-nhiều giữa khóa và các mục, a Lookup<TKey, TValue>có thể là một cấu trúc tốt hơn a Dictionary<TKey, TValue>.
casperOne 30/09/19

1
@PatPeter Tôi sẽ nói ILookup là cấu trúc tốt hơn để sử dụng (nó giống như bản đồ đa bản đồ của văn bản, nếu bạn biết các thuật toán thu thập C ++) nhưng nó có một yếu tố lớn cần lưu ý - tra cứu được tạo ra là không thể thay đổi. Bạn không thể thêm hoặc xóa các mục sau đó.
gbjbaanb

Sự cân nhắc khác là mặc dù ILookupthường là cấu trúc trong mã lý tưởng, nhưng nó thường không được xử lý tốt để tuần tự hóa.
Jeff B
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.