繁体   English   中英

LINQ 与 groupby 和计数

[英]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);
}

> 这是一个非常快速的回复,但我对第一行有点问题,特别是“data.groupby(info=>info.metric)”

我假设你已经有一些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对象。 在第二次出现时, nGrouping类型,因为现在它是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM