我知道很容易通过两个属性对对象进行分组,但我想知道是否可以通过两个属性中的任何一个进行分组?可能下面的例子会更清楚: -
假设我有这张表: -
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 :(得分:3)
要根据您的要求添加一些详细信息,您似乎希望在CategoryID
上执行常规组。然后,如果任何组只包含一个元素,您希望这些元素按Fruit
分组。该群组的密钥必须同时包含CategoryID
和Fruit
。对于示例数据中的第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 ----------------+-----------------