问题描述
当前有一个实体类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
现在,需要使用Linq
按UserInfo
的metric
属性进行分组,并统计每个分组的总数,比如以上示例数据分组统计的结果为:
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]
方案二
使用Linq
的Lambda
查询表达式,如:
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()));
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册