号外号外: 原[图享网]更名为 码友网(codedefault.com) 啦,感谢大家一路上的陪伴与支持。代码的世界里,码友网与大家一起同行!

[Linq].NET/C#程序开发中如何使用Linq对集合List<T>进行分组(GroupBy)和统计(Count)?

.NET 作者: Rector 1214阅读 0评论 0收藏 收藏本文 编辑

郑重申明:本文未经许可,禁止任何形式转载

问题描述

当前有一个实体类UserInfo.cs,包含的属性可能如下:

name, metric, day, other_metric

UserInfo集合List<UserInfo>包含的数据如下:

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

现在,需要使用LinqUserInfometric属性进行分组,并统计每个分组的总数,比如以上示例数据分组统计的结果为:

metric count
0 3
1 2
2 2
3 1

现在试着使用Linq查询表达式来实现以上的需求,Linq查询表达式如下:

 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].NET/C#程序开发中如何使用Linq对集合List<T>进行分组(GroupBy)和统计(Count)?

方案一

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

执行GroupBy后的分组集合为如下所示:

  (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]

方案二

使用LinqLambda查询表达式,如:

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

或者:

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

阅读了该文章的人还浏览了...

本文永久链接码友网 » [Linq].NET/C#程序开发中如何使用Linq对集合List<T>进行分组(GroupBy)和统计(Count)?

发布于: 2018-02-06 11:53:00
分享扩散: