C # Linq Объединить несколько последовательностей по ключу - PullRequest
1 голос
/ 04 марта 2011

У меня есть два IList<Traffic> Мне нужно объединить.

Трафик - это простой класс:

class Traffic
{
  long MegaBits;
  DateTime Time;
}

Каждый IList содержит одинаковые времена, и мне нужен один IList<Traffic>, где я суммировал Мегабиты, но сохранил время как ключ.

Возможно ли это с помощью Linq?

РЕДАКТИРОВАТЬ:

Я забыл упомянуть, что времяне обязательно уникален ни в одном списке, несколько экземпляров Traffic могут иметь одинаковое время.

Также я мог бы столкнуться с X списками (более 2), я должен был упомянуть и это - извините: -(

ПРИМЕР:

IEnumerable<IList<Traffic>> trafficFromDifferentNics;

var combinedTraffic = trafficFromDifferentNics
                        .SelectMany(list => list)
                        .GroupBy(traffic => traffic.Time)
                        .Select(grp => new Traffic { Time = grp.Key, MegaBits = grp.Sum(tmp => tmp.MegaBits) });

Приведенный выше пример работает, поэтому спасибо за ваш ввод: -)

Ответы [ 3 ]

3 голосов
/ 04 марта 2011

это больше похоже на

var store = firstList.Concat(secondList).Concat(thirdList)/* ... */;
var query = from item in store
            group item by item.Time
            into groupedItems
            select new Traffic
            {
                MegaBits = groupedItems.Sum(groupedItem => groupedItem.MegaBits),
                Time = groupedItems.Key
            };

или, с вашей переделкой

IEnumerable<IList<Traffic>> stores;
var query = from store in stores
            from item in store
            group item by item.Time
            into groupedItems
            select new Traffic
            {
                MegaBits = groupedItems.Sum(groupedItem => groupedItem.MegaBits),
                Time = groupedItems.Key
            };
1 голос
/ 04 марта 2011

Вы можете объединить элементы в обоих списках в один набор, а затем сгруппировать по ключу, чтобы получить сумму перед преобразованием обратно в новый набор Traffic экземпляров.

var result = firstList.Concat(secondList)
    .GroupBy(trf => trf.Time, trf => trf.MegaBits)
    .Select(grp => new Traffic { Time = grp.Key, MegaBits = grp.Sum()});
1 голос
/ 04 марта 2011

Звучит примерно так:

var query = from x in firstList
            join y in secondList on x.Time equals y.Time
            select new Traffic { MegaBits = x.MegaBits + y.MegaBits,
                                 Time = x.Time };

Обратите внимание, что это объединится попарно, поэтому, если в каждом списке несколько элементов с одинаковым временем, вы можете не получить желаемых результатов..

...