【问题标题】:Using LINQ to merge a list of objects使用 LINQ 合并对象列表
【发布时间】:2010-02-19 17:12:16
【问题描述】:

我有两个对象列表,我想使用 Linq 合并它们,但是如果两个列表包含具有相同键的对象,我只想要具有最大 LastUpdated 值的对象。

我认为我可以通过键 a 和 max(LastUpdated) 以某种方式获得一个列表分组,然后加入到加入 key 和 LastUpdated 的列表中,但必须有一种更有效的方法......

List<MyObject> lstListA = new List<MyObject>;
List<MyObject> lstListB = new List<MyObject>;

public class MyObject
{
    public string Key {get;set;}
    public string Value {get;set;}
    public DateTime LastUpdated {get;set;}
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    一个选项,使用来自MoreLINQDistinctBy

    var query = lstListA.Concat(lstListB)
                        .OrderByDescending(x => x.LastUpdated)
                        .DistinctBy(x => x.Key);
    

    【讨论】:

    • DistinctBy 与将 Distinct 与比较器一起使用有何不同?结果会一样吗?
    • @Jeremy:是的,结果是一样的 - DistinctBy 更简单:)
    【解决方案2】:

    经典的选择获胜者。

    IEnumerable<MyObject> query = lstListA
      .Concat(lstListB)
      .GroupBy(x => x.Key)
    //now work with each group to pick a winner
      .Select(g => g.OrderByDescending(x => x.LastUpdated).First())
    

    【讨论】:

      【解决方案3】:

      有点复杂,但这似乎也有效:

      var mergedItems = lstListA.Concat(lstListB);
      
      mergedItems =
          (from item in mergedItems
          group item by item.Key into grp
          let sameKey = mergedItems.Where(obj => obj.Key == grp.Key)
          select sameKey.Where(obj => obj.LastUpdated == grp.Max(obj2 => obj2.LastUpdated)).Single()
      ).ToList();
      

      【讨论】:

        猜你喜欢
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多