2011-03-04 89 views
1

我有两个IList<Traffic>我需要组合。C#Linq按键组合多个序列

交通是一个简单的类:

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

上述作品中的例子,十分感谢您的投入:-)

回答

1

你可以在这两个列表中的项目合并成一个组,然后在密钥组得到的总和前转化为一组新的Traffic实例。

var result = firstList.Concat(secondList) 
    .GroupBy(trf => trf.Time, trf => trf.MegaBits) 
    .Select(grp => new Traffic { Time = grp.Key, MegaBits = grp.Sum()}); 
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 }; 

注意,这将在PA加入非智慧的方式,所以如果每个列表中同时存在多个元素,则可能无法获得所需的结果。

+0

嗯我想我应该写的 - 时间不保证在任何列表中都是唯一的。为了清楚起见,我会更新这个问题。 – Steffen 2011-03-04 09:48:12

+0

@Steffen:在这一点上,如果你能够给出一个输入和期望输出的样本,那么这真的很有帮助。 – 2011-03-04 09:52:32

+0

增加了一个工作示例,感谢您的输入。 – Steffen 2011-03-04 10:04:27

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