开发者

Using LINQ to merge a list of objects

开发者 https://www.devze.com 2022-12-21 03:43 出处:网络
I have two lists of objects, using Linq I would like to merge them, but where the two lists contain objects with the same key, I only want the one with the greatest LastUpdated Value.

I have two lists of objects, using Linq I would like to merge them, but where the two lists contain objects with the same key, I only want the one with the greatest LastUpdated Value.

I thought that I could somehow get a list grouping by key a with max(LastUpdated) then join back to the list joining on key and LastUpdated, but there must be a mor开发者_如何学Goe efficient way...

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


One option, using DistinctBy from MoreLINQ:

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


Classic pick-a-winner.

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


A bit comvoluted, but this seems to work as well:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号