9

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

3 Answers 3

17

One option, using DistinctBy from MoreLINQ:

var query = lstListA.Concat(lstListB)
                    .OrderByDescending(x => x.LastUpdated)
                    .DistinctBy(x => x.Key);
Sign up to request clarification or add additional context in comments.

2 Comments

How does the DistinctBy differ from using Distinct with a comparer? Will the result be the same?
@Jeremy: Yes, the result is the same - DistinctBy is just easier :)
2

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

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.