【问题标题】:C# Linq Combine multiple sequences by keyC# Linq 按键组合多个序列
【发布时间】:2011-03-04 18:11:48
【问题描述】:

我有两个 IList<Traffic> 我需要合并。

Traffic 是一个简单的类:

class Traffic
{
  long MegaBits;
  DateTime Time;
}

每个IList 拥有相同的Times,我需要一个IList<Traffic>,我已经总结了MegaBits,但将Time 作为关键。

这可以使用 Linq 吗?

编辑:

我忘了提到 Time 在任何列表中不一定是唯一的,多个 Traffic 实例可能具有相同的 Time。

另外我可能会遇到 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) });

上面的例子有效,感谢您的输入:-)

【问题讨论】:

    标签: c# linq linq-to-objects


    【解决方案1】:

    这听起来更像

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        听起来像:

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

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

        【讨论】:

        • 嗯,我想我应该这样写 - 不能保证时间在任何列表中都是唯一的。为了清楚起见,我会更新问题。
        • @Steffen:在这一点上,如果你能给出输入和预期输出的样本,那真的很有帮助。
        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 2016-12-06
        • 2012-06-10
        相关资源
        最近更新 更多