为了账号安全,请及时绑定邮箱和手机立即绑定

LINQ with groupby和count

LINQ with groupby和count

C#
Qyouu 2019-08-26 15:31:21
LINQ with groupby和count这很简单,但我不知所措:给定这种类型的数据集:UserInfo(name, metric, day, other_metric)和这个样本数据集:joe  1 01/01/2011 5jane 0 01/02/2011 9john 2 01/03/2011 0jim  3 01/04/2011 1jean 1 01/05/2011 3jill 2 01/06/2011 5jeb  0 01/07/2011 3jenn 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方法非常相似,但给了我一个不同的答案。
查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞


调用之后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),它意味着“对于xIEnumerable中定义的每个元素data,计算它.metric,然后将具有相同度量的所有元素分组为a 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]


查看完整回答
反对 回复 2019-08-26
?
HUH函数

TA贡献1836条经验 获得超4个赞

假设userInfoListList<UserInfo>

        var groups = userInfoList            .GroupBy(n => n.metric)
            .Select(n => new
            {
                MetricName = n.Key,
                MetricCount = n.Count()
            }
            )
            .OrderBy(n => n.MetricName);

对于lambda表达式GroupBy()n => n.metric意味着它会得到场metric从每一个UserInfo遇到的对象。类型n取决于上下文,在第一次出现时是类型UserInfo,因为列表包含UserInfo对象。在第二次出现n是类型Grouping,因为现在它是一个Grouping对象列表。

Grouping有像你这样的扩展方法.Count().Key()以及你期望的其他任何东西。正如你查.Lenght一个string,你可以检查.Count()在一组。


查看完整回答
反对 回复 2019-08-26
?
呼唤远方

TA贡献1856条经验 获得超11个赞

userInfos.GroupBy(userInfo => userInfo.metric)
        .OrderBy(group => group.Key)
        .Select(group => Tuple.Create(group.key, group.Count()));


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 415 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信