linq与groupby和count
这很简单,但我很茫然:鉴于这种types的数据集:
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和数….任何帮助?
张贴编辑:我永远不能得到张贴的答案工作,因为他们总是返回一个不同的计数logging。 但是,我能够把一个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()};
这个结果给了我一个有序的“度量”logging和与每个相关的用户数量。 一般来说,我对LINQ是新手,对于未经训练的人来说,这种方法看起来与纯粹的LINQ方法非常相似,但给了我一个不同的答案。
调用GroupBy
,您将得到一系列组IEnumerable<Grouping>
,其中每个Grouping本身公开用于创build组的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 => info.metric)”
我假设你已经有一个类似的列表/数组
class UserInfo { string name; int metric; ..etc.. } ... List<UserInfo> data = ..... ;
当您执行data.GroupBy(x => x.metric)
,它的意思是“对于由data
定义的IEnumerable中的每个元素x
,计算它是.metric
,然后将具有相同度量的所有元素Grouping
为一个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]
假设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
的types取决于上下文,首先出现的是UserInfo
types,因为列表包含UserInfo
对象。 在第二个事件中, n
是Grouping
types,因为现在它是一个Grouping
对象列表。
Grouping
有像.Count()
.Key()
这样的扩展方法,还有其他你所期望的。 就像你要检查一个string
,你可以检查一个组的.Count()
。
userInfos.GroupBy(userInfo => userInfo.metric) .OrderBy(group => group.Key) .Select(group => Tuple.Create(group.key, group.Count()));