2009-01-14 42 views
21

Làm cách nào để tạo nhóm lồng nhau cho bảng bên dưới, sử dụng LINQ? Tôi muốn nhóm theo Code, sau đó đến Mktcode.Làm cách nào để tạo một nhóm theo từ điển lồng nhau bằng LINQ?

Code Mktcode Id 
==== ======= ==== 
1 10  0001 
2 20  0010 
1 10  0012 
1 20  0010 
1 20  0014 
2 20  0001 
2 30  0002 
1 30  0002 
1 30  0005 

Tôi muốn một từ điển, cuối cùng, như

Dictionary<Code, List<Dictionary<Mktcode, List<Id>>>> 

Vì vậy, các giá trị của từ điển này sẽ là

{1, ({10,(0001,0012)}, {20,(0010,0014)}, {30, (0002, 0005)})}, 
{2, ({20,(0001, 0010)}, {30, (0020)})} 

Trả lời

26

Tôi muốn nghĩ về nó theo cách này:

  • Bạn đang chủ yếu nhóm bằng mã, do đó làm điều đó đầu tiên
  • Đối với mỗi nhóm, bạn vẫn có một danh sách các kết quả - vì vậy áp dụng khác nhóm lại ở đó.

Cái gì như:

var groupedByCode = source.GroupBy(x => x.Code); 

var groupedByCodeAndThenId = groupedByCode.Select(group => 
    new { Key=group.Key, NestedGroup = group.ToLookup 
             (result => result.MktCode, result => result.Id)); 

var dictionary = groupedByCodeAndThenId.ToDictionary 
    (result => result.Key, result => result.NestedGroup); 

Điều đó sẽ cung cấp cho bạn một Dictionary<Code, Lookup<MktCode, Id>> - Tôi nghĩ đó là những gì bạn muốn. Nó hoàn toàn chưa được kiểm tra.

+5

Geez, bạn đúng rồi. Sức mạnh tinh thần của bạn chỉ đơn giản là không thể tin được. – Graviton

16

Bạn có thể xây dựng tra cứu (Các loại từ điển < , Danh sách < >>) sử dụng group by into

var lines = new [] 
{ 
    new {Code = 1, MktCode = 10, Id = 1}, 
    new {Code = 2, MktCode = 20, Id = 10}, 
    new {Code = 1, MktCode = 10, Id = 12}, 
    new {Code = 1, MktCode = 20, Id = 10}, 
    new {Code = 1, MktCode = 20, Id = 14}, 
    new {Code = 2, MktCode = 20, Id = 1}, 
    new {Code = 2, MktCode = 30, Id = 2}, 
    new {Code = 1, MktCode = 30, Id = 2}, 
    new {Code = 1, MktCode = 30, Id = 5}, 
}; 

var groups = from line in lines 
    group line by line.Code 
    into codeGroup 
    select new 
    { 
     Code = codeGroup.Key, 
     Items = from l in codeGroup 
      group l by l.MktCode into mktCodeGroup 
      select new 
      { 
       MktCode = mktCodeGroup.Key, 
       Ids = from mktLine in mktCodeGroup 
        select mktLine.Id 
      } 
    }; 
+0

Bất kỳ ý tưởng nào về cách chuyển đổi nhóm thành loại từ điển? – Graviton

+5

groups.ToDictionary (g => g.Key, g => g.ToList()) –

12

Đây là cách tôi muốn làm điều đó:

Dictionary<Code, Dictionary<MktCode, List<Id>>> myStructure = 
    myList 
    .GroupBy(e => e.Code) 
    .ToDictionary(
     g => g.Key, 
     g => g 
     .GroupBy(e => e.Mktcode) 
     .ToDictionary(
      g2 => g2.Key, 
      g2 => g2.Select(e => e.Id).ToList() 
     ) 
    ) 

Đây là sự sụp đổ của quá trình:

Nhóm các yếu tố của Mã, và tạo ra một từ điển bên ngoài mà chính là mã.

myList 
    .GroupBy(e => e.Code) 
    .ToDictionary(
     g => g.Key, 

Đối với mỗi khóa trong từ điển bên ngoài, hãy gom lại các phần tử bằng Mktcode và tạo từ điển bên trong.

 g => g 
     .GroupBy(e => e.Mktcode) 
     .ToDictionary(
      g2 => g2.Key, 

Đối với mỗi khóa trong từ điển bên trong, hãy dự đoán id của các yếu tố đó và chuyển đổi thành danh sách.

  g2 => g2.Select(e => e.Id).ToList() 
     ) 
    ) 
+1

Đây là cái tôi hiểu. Cảm ơn! – orad

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