2013-01-13 35 views
4

我在使用C#/ LINQ進行雙重分組時遇到了與以下示例類似的數據。我開始與TickItems從數據層來的列表,我現在已經得到了它形這樣:有兩個分組的LINQ

TickItem { ItemName: string; QtyNeeded: int; QtyFulfilled: int; Category: string; }

List<TickItem> items = new List<TickItem>(); 
items.Add("apple", 1, 0, "food"); 
items.Add("orange", 1, 1, "food"); 
items.Add("orange", 1, 0, "food"); 
items.Add("bicycle", 1, 1, "vehicle"); 
items.Add("apple", 1, 1, "food"); 
items.Add("apple", 1, 0, "food"); 
items.Add("car", 1, 1, "vehicle"); 
items.Add("truck", 1, 0, "vehicle"); 
items.Add("banana", 1, 0, "food"); 

我按類別需要這組數據與總和最終結果中的每個數字列。最後,它的形狀應是這樣的:

{ "food": { "apple" : 3, 1 }, 
      { "banana" : 1, 0 }, 
      { "orange" : 2, 1 } }, 
{ "vehicle": { "bicycle": 1, 1 }, 
      { "car" : 1, 1 }, 
      { "truck" : 1, 0} } 

我已經能夠(通過ITEMNAME和類別組組)單獨做每個分組的,但我一直沒能在執行這兩個分組一個LINQ語句。我的代碼到目前爲止:

var groupListItemName = things.GroupBy(tiλ => tiλ.ItemName).ToList(); 
var groupListCategory = things.GroupBy(tiλ => tiλ.Category).ToList(); 

任何人都可以幫忙嗎?

[編輯:我可以用任何一種方法或查詢語法,較容易可視化與過程]

回答

1
var query = from i in items 
      group i by i.Category into categoryGroup 
      select new 
      { 
       Category = categoryGroup.Key, 
       Items = categoryGroup.GroupBy(g => g.ItemName) 
            .Select(g => new 
            { 
             ItemName = g.Key, 
             QtyNeeded = g.Sum(x => x.QtyNeeded), 
             QtyFulfilled = g.Sum(x => x.QtyFulfilled) 
            }).ToList() 
      }; 

這個查詢將返回代表按類別分組的項目匿名對象的序列。每個類別對象都有一個匿名對象列表,其中將包含每個項目名稱的總計。

foreach(var group in query) 
{ 
    // group.Category 
    foreach(var item in group.Items) 
    { 
     // item.ItemName 
     // item.QtyNeeded 
     // item.QtyFulfilled 
    } 
} 
+1

你是人中的神...感謝這麼快的響應! –

0

GroupBy具有過載,讓你指定成果轉化,例如:

var result = items.GroupBy(i => i.Category, 
    (category, categoryElements) => new 
    { 
     Category = category, 
     Elements = categoryElements.GroupBy(i => i.ItemName, 
      (item, itemElements) => new 
      { 
       Item = item, 
       QtyNeeded = itemElements.Sum(i => i.QtyNeeded), 
       QtyFulfilled = itemElements.Sum(i => i.QtyFulfilled) 
      }) 
    });