2010-02-19 22 views
9

Mam dwie listy obiektów, używając Linq Chciałbym je połączyć, ale tam, gdzie dwie listy zawierają obiekty z tym samym kluczem, chcę tylko ten o największej wartości LastUpdated.Używanie LINQ do scalania listy obiektów

Myślałem, że mogę jakoś uzyskać listę Grupowanie według klucza A z max (LastUpdated), a następnie dołączyć z powrotem do listy łączenia na klucz i LastUpdated, ale nie musi być bardziej efektywny sposób ...

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

Odpowiedz

17

Jedną z opcji, używając DistinctBy z MoreLINQ:

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

Czym różni się DistinctBy od używania Distinct z porównywarką? Czy wynik będzie taki sam? – Jeremy

+0

@Jeremy: Tak, wynik jest taki sam - DistinctBy jest po prostu łatwiejsze :) –

0

trochę comvoluted, ale to wydaje się działać także:

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

Klasyczny 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()) 
Powiązane problemy