小编典典

LINQ 与 groupby 和计数

all

这很简单,但我不知所措:鉴于这种类型的数据集:

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 方法非常相似,但却给了我不同的答案。


阅读 72

收藏
2022-05-05

共1个答案

小编典典

调用后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);
}

这是一个非常快速的回复,但我在第一行遇到了一些问题,特别是“data.groupby(info=>info.metric)”

我假设你已经有一些class看起来像的列表/数组

class UserInfo {
    string name;
    int metric;
    ..etc..
} 
...
List<UserInfo> data = ..... ;

当你这样做时,它的意思是“对于IEnumerable 中定义的data.GroupBy(x => x.metric)每个元素,计算它,然后将具有相同度量的所有元素分组为
a并返回所有结果组中的一个。给定您的示例数据集x``data``.metric``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]
2022-05-05