Как сгруппировать и суммировать список списков с помощью Linq - PullRequest
1 голос
/ 13 июля 2020

У меня есть список списков, содержащий объект ежечасно . Мне нужно сгруппировать все списки в один, сгруппировав по часам и суммируя клики и блоки. Я написал код, используя для l oop, но задаюсь вопросом, как это сделать с помощью 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) };
        }

1 Ответ

3 голосов
/ 13 июля 2020

Я полагаю, вы ищете SelectMany и GroupBy:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...