[英]LINQ with groupby and count
这很简单,但我不知所措:鉴于这种类型的数据集:
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 和计数......有什么帮助吗?
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 方法非常相似,但给了我不同的答案。
调用GroupBy
,您将获得一系列组IEnumerable<Grouping>
,其中每个 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);
}
我假设你已经有一些class
的列表/数组,看起来像
<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
当你做data.GroupBy(x => x.metric)
,这意味着“对于由data
定义的 IEnumerable 中的每个元素x
,计算它的.metric
,然后将具有相同度量的所有元素Grouping
到一个Grouping
并返回一个IEnumerable
所有结果组的。鉴于您的示例数据集
(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之后将导致以下结果:
(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]
假设userInfoList
是一个List<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
意味着它将从遇到的每个UserInfo
对象中获取字段metric
。 n
的类型取决于上下文,在第一次出现时它是UserInfo
类型,因为列表包含UserInfo
对象。 在第二次出现时, n
是Grouping
类型,因为现在它是Grouping
对象的列表。
Grouping
具有扩展方法,例如.Count()
、 .Key()
以及您期望的几乎任何其他方法。 正如你检查.Lenght
上一个string
,您可以检查.Count()
上的一组。
userInfos.GroupBy(userInfo => userInfo.metric)
.OrderBy(group => group.Key)
.Select(group => Tuple.Create(group.Key, group.Count()));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.