2014-10-29 44 views
3

我知道它很容易通過兩個屬性對對象進行分組,但我想知道是否可以通過兩個屬性中的任何一個進行分組?也許下面的例子將使它更加清晰: -GroupBy LINQ中的兩個屬性

假設我有這個表: -

CategoryID  Fruit 
------------------------- 
1     Apple 
1     Grapes 
2     Tablet 
2     Laptop 
5     Coke 
6     Coke 

現在,我想這組數據或者如果CategoryIds相同或水果一樣。

樣本輸出: -

Group 1:- 
1   Apple 
1   Grapes 

Group 2:- 
2   Tablet 
2   Laptop 

Group 3:- 
5   Coke 
6   Coke 
+0

什麼如果項目會分成兩組,例如你的例子中有2個可樂嗎? – MarcinJuraszek 2014-10-29 06:11:54

+0

@MarcinJuraszek - 然後CategoryID組應該是首選。 – 2014-10-29 06:14:34

回答

3

一些細節添加到您的要求,它似乎想要通過CategoryID做正常對照組。然後,如果任何組只包含一個單個元素,您希望這些元素按Fruit分組。該組的關鍵將必須包含CategoryIDFruit。對於樣本數據中的組1和組2,Fruit屬性將是Fruit的默認值。對於組3,CategoryID將是CategoryID的默認值。

您可以通過執行兩個嵌套分組,然後再展開內部分組執行此計算:

var groupedItems = items 
    .GroupBy(item => item.CategoryID) 
    .GroupBy(
    inner => inner.Count() > 1 
     ? new { CategoryID = inner.Key, Fruit = default(String) } 
     : new { CategoryID = default(Int32), inner.First().Fruit } 
) 
    .Select(
    outer => outer.Count() == 1 
     ? new { outer.Key, Items = outer.First().ToList() } 
     : new { outer.Key, Items = outer.Select(inner => inner.First()).ToList() } 
); 

鑑於此輸入

var items = new[] { 
    new { CategoryID = 1, Fruit = "Apple" }, 
    new { CategoryID = 1, Fruit = "Coke" }, 
    new { CategoryID = 2, Fruit = "Tablet" }, 
    new { CategoryID = 2, Fruit = "Coke" }, 
    new { CategoryID = 5, Fruit = "Coke" }, 
    new { CategoryID = 6, Fruit = "Coke" } 
}; 

你得到這個輸出

 
Key    |Items 
----------------+----------------- 
CategoryId Fruit|CategoryID Fruit 
----------------+----------------- 
1   null |1   Apple 
       |1   Coke 
----------------+----------------- 
2   null |2   Tablet 
       |2   Coke 
----------------+----------------- 
0   Coke |5   Coke 
       |6   Coke 
----------------+----------------- 

+0

謝謝馬丁!我基本上希望通過CategoryID或Fruits(無論列表中的哪些匹配)進行分組,而不是僅通過CategoryID進行分組。但是,您提供的查詢是正確分組,我得到正確的輸出。謝謝。 – 2014-10-29 09:30:53