LINQ with groupby和count

时间:2011-09-02 15:27:16

标签: c# linq group-by

这很简单,但我很茫然: 鉴于此类数据集:

UserInfo(name, metric, day, other_metric)

和此示例数据集:

joe  1 01/01/2011 5
jane 0 01/02/2011 9
john 2 01/03/2011 0
jim  3 01/04/2011 1
jean 1 01/05/2011 3
jill 2 01/06/2011 5
jeb  0 01/07/2011 3
jenn 0 01/08/2011 7

我想检索一个表,按顺序(0,1,2,3 ..)列出指标,并计算计数的总次数。所以从这个集合你最终得到:

0 3    
1 2    
2 2    
3 1

我正在努力解决LINQ语法问题,但我仍然坚持将groupby和count放在哪里.... 任何帮助??

POST编辑:我从来没有能够获得已发布的答案,因为他们总是返回一条记录,其中包含不同计数的数量。但是,我能够将LINQ to SQL示例放在一起工作:

        var pl = from r in info
                 orderby r.metric    
                 group r by r.metric into grp
                 select new { key = grp.Key, cnt = grp.Count()};

这个结果给了我一组有序的记录,其中包含“指标”和与每个记录相关联的用户数。我显然对LINQ很新,对于我未经训练的眼睛,这种方法看起来与纯LINQ方法非常相似,但给了我一个不同的答案。

3 个答案:

答案 0 :(得分:337)

调用GroupBy后,您会收到一系列组IEnumerable<Grouping>,其中每个分组本身都会公开用于创建组的Key,并且也是IEnumerable<T>的任何组项目在您的原始数据集中。您只需在该分组上调用Count()即可获得小计。

foreach(var line in data.GroupBy(info => info.metric)
                        .Select(group => new { 
                             Metric = group.Key, 
                             Count = group.Count() 
                        })
                        .OrderBy(x => x.Metric)
{
     Console.WriteLine("{0} {1}", line.Metric, line.Count);
}

<小时/>

  

这是一个非常快速的回复,但我对第一行有一点问题,特别是“data.groupby(info =&gt; info.metric)”

我假设您已经有一些class的列表/数组看起来像

class UserInfo {
    string name;
    int metric;
    ..etc..
} 
...
List<UserInfo> data = ..... ;

执行data.GroupBy(x => x.metric)时,表示“对于x定义的IEnumerable中的每个元素data,计算它为.metric,然后将所有元素分组为Grouping度量标准为IEnumerable并返回所有结果组的 <DATA> | Grouping Key (x=>x.metric) | joe 1 01/01/2011 5 | 1 jane 0 01/02/2011 9 | 0 john 2 01/03/2011 0 | 2 jim 3 01/04/2011 1 | 3 jean 1 01/05/2011 3 | 1 jill 2 01/06/2011 5 | 2 jeb 0 01/07/2011 3 | 0 jenn 0 01/08/2011 7 | 0 。给出您的示例数据集

(Group 1): [joe  1 01/01/2011 5, jean 1 01/05/2011 3]
(Group 0): [jane 0 01/02/2011 9, jeb  0 01/07/2011 3, jenn 0 01/08/2011 7]
(Group 2): [john 2 01/03/2011 0, jill 2 01/06/2011 5]
(Group 3): [jim  3 01/04/2011 1]

在groupby之后会产生以下结果:

{{1}}

答案 1 :(得分:40)

假设userInfoListList<UserInfo>

        var groups = userInfoList
            .GroupBy(n => n.metric)
            .Select(n => new
            {
                MetricName = n.Key,
                MetricCount = n.Count()
            }
            )
            .OrderBy(n => n.MetricName);

GroupBy()的lambda函数,n => n.metric表示它将从遇到的每个metric对象中获取字段UserInfon的类型取决于上下文,在第一次出现时类型为UserInfo,因为该列表包含UserInfo个对象。在第二次出现时,n的类型为Grouping,因为现在它是Grouping个对象的列表。

Grouping.Count().Key()等扩展方法以及您期望的其他任何内容。就像您在.Lenght上查看string一样,您可以查看某个群组的.Count()

答案 2 :(得分:20)

userInfos.GroupBy(userInfo => userInfo.metric)
        .OrderBy(group => group.Key)
        .Select(group => Tuple.Create(group.key, group.Count()));