0

请考虑这种情况:

我有这样的数据:

 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用于第二组

4

3 回答 3

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()
            });
于 2012-11-07T13:56:57.233 回答
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
于 2012-11-07T12:49:41.513 回答
0

在这种情况下,您需要一个映射1,2,31让说和4,52说的函数,那么func<int,int> grouper = i => (i -1) / 3应该适合您对该数据集的用途。

那么linq是:

var result = data.GroupBy( r => (r.Group-1)/3,
                           g => g.Count());

注意:如果这将在数据库端完成,您需要小心,因为除法运算符可能无法按照您的意愿进行映射。即在 c# 中,int 除法返回一个 int,因此为您提供分数的整数部分,而数据库可能返回一个 Double 从而破坏所需的分组。在这种情况下,您将需要类似的东西r => ((r.Group -1) - (r.Group -1) %3 )/3

于 2012-11-07T13:13:50.567 回答