请考虑这种情况:
我有这样的数据:
Id Group Value
-----------------------------------
1 1 100
2 1 120
3 1 100
4 2 90
5 2 105
6 3 300
7 4 123
8 4 110
9 5 100
10 5 110
我希望GroupBy
对此数据1,2,3
位于一个组中,4,5
位于另一个组中。我如何使用LINQ
?
感谢
修改1)
我想将1,2,3
放在一个组中,4,5
放在另一个组中,然后对它们执行Count
聚合,第一组 6 ,<第二组强> 4
答案 0 :(得分:2)
这个怎么样?
int[] groupA = { 1, 2, 3 };
int[] groupB = { 4, 5 };
var result = data
.GroupBy(a => groupA.Contains(a.Group) ? "A" :
groupB.Contains(a.Group) ? "B" :
"N/a")
.Select(a => new
{
KEY = a.Key,
VALUE = a.Count()
});
答案 1 :(得分:0)
因此,分组规则完全不清楚,您只需要计算项目数,我认为您根本不需要分组。
int[] groups = { 1, 2, 3 }; // or { 4, 5 } for other groups
var groupsCount = items.Where(i => groups.Contains(i.Group))
.Count();
您可以将此查询放入方法(假设项目是字段)
int GetItemsCountInGroups(params int[] groups)
{
return items.Where(i => groups.Contains(i.Group))
.Count();
}
用法
int count = GetItemsCountInGroups(1, 2, 3); // 6
int anotherCount = GetItemsCountInGroups(4, 5); // 4
答案 2 :(得分:0)
在这种情况下,您需要一个将1,2,3
映射到1
的功能,然后让我们说4,5
到2
,然后func<int,int> grouper = i => (i -1) / 3
应该适合您的目的对于这个数据集。
然后是linq:
var result = data.GroupBy( r => (r.Group-1)/3,
g => g.Count());
注意:如果要在数据库端完成此操作,则需要小心,因为除法运算符可能无法按您的意图进行映射。即在c#int division中返回一个int,因此给出了分数的整数部分,而数据库可能返回一个Double,从而打破了所需的分组。在这种情况下,您需要r => ((r.Group -1) - (r.Group -1) %3 )/3
之类的东西。