代码之家  ›  专栏  ›  技术社区  ›  Jeremy

使用LINQ合并对象列表

  •  9
  • Jeremy  · 技术社区  · 15 年前

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

    我想我可以用max(lastupdated)按a键进行列表分组,然后用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;}
    }
    
    3 回复  |  直到 15 年前
        1
  •  17
  •   Jon Skeet    15 年前

    一个选项,使用 DistinctBy MoreLINQ :

    var query = lstListA.Concat(lstListB)
                        .OrderByDescending(x => x.LastUpdated)
                        .DistinctBy(x => x.Key);
    
        2
  •  2
  •   Amy B    15 年前

    经典的最佳赢家。

    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
  •  0
  •   Konamiman    15 年前

    有点共同进化,但这似乎也起作用:

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