LINQ与groupby和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并且计数....任何帮助?
张贴编辑:我永远无法获得发布的答案工作,因为他们总是返回一个不同数量的记录。 不过,我能够将一个可以工作的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>
,其中每个组本身公开用于创建组的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
,看起来像
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
它会在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()));
链接地址: http://www.djcxy.com/p/31913.html