首页 > 解决方案 > 如何使用 Linq 对列表进行分组和求和

问题描述

我有一个包含每小时对象的列表列表。我需要通过按小时分组并将点击次数和块数相加,将所有列表归为一个。我使用 for 循环编写了代码,但想知道如何使用 Linq 来完成。

    class hourly
    {
        public int clicks { get; set; }
        public int blocks { get; set; }
        public int hour { get; set; }

    }


       var m = new List<List<hourly>>();

     
     /// populate m from DB

   
        var n = new List<hourly>(24);

        for (int i = 0; i < 24; i++)
        {
            n.Add(new hourly());
            n[i] = new hourly() { hour = i, clicks = m.Sum(x => x[i].clicks), blocks = m.Sum(x => x[i].blocks) };
        }

标签: c#linq

解决方案


我想你正在寻找SelectManyGroupBy

var result = m
    .SelectMany(ll => ll)
    .GroupBy(h => h.hour)
    .Select(g => new hourly
    {
        hour = g.Key,
        blocks = g.Sum(h => h.blocks),
        clicks = g.Sum(h => h.clicks)
    })
    .ToList();

如果您的数据库中在某个具体小时内没有实例,hourly并且您需要在最终结果中包含所有实例,则可以在 之后添加虚拟SelectMany实例,例如:

.Concat(Enumerable.Range(0, 24).Select(i => new hourly {hour = i}))

如果订购很重要OrderBy,请先申请ToList


推荐阅读