C#Linq按键组合多个序列

时间:2011-03-04 09:35:58

标签: c# linq linq-to-objects

我需要合并两个IList<Traffic>

交通是一个简单的类:

class Traffic
{
  long MegaBits;
  DateTime Time;
}

每个IList持有相同的时间,我需要一个IList<Traffic>,我已经总结了MegaBits,但保留了时间作为关键。

使用Linq可以吗?

编辑:

我忘了提及Time在任何列表中都不一定是唯一的,多个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 个答案:

答案 0 :(得分:3)

这听起来更像是

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 :(得分:1)

听起来像是:

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 };

请注意,这将以成对方式连接,因此如果每个列表中有多个具有相同时间的元素,则可能无法获得所需的结果。

答案 2 :(得分:1)

您可以将两个列表中的项目合并为一个集合,然后对该键进行分组以获得总和,然后再转换回一组新的Traffic个实例。

var result = firstList.Concat(secondList)
    .GroupBy(trf => trf.Time, trf => trf.MegaBits)
    .Select(grp => new Traffic { Time = grp.Key, MegaBits = grp.Sum()});