我需要合并两个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) });
以上示例有效,感谢您的意见: - )
答案 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()});