2010-02-19 10 views
9

Ho due elenchi di oggetti, utilizzando Linq vorrei unirli, ma dove i due elenchi contengono oggetti con la stessa chiave, voglio solo quello con il valore LastUpdated più grande.Uso di LINQ per unire un elenco di oggetti

ho pensato che avrei potuto in qualche modo ottenere un elenco di raggruppamento da una chiave con Max (LastUpdated) poi unirsi di nuovo alla lista entrare in chiave e LastUpdated, ma ci deve essere un modo più efficiente ...

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

risposta

17

Una possibilità, utilizzando DistinctBy da MoreLINQ:

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

In che modo differisce Distinct dall'utilizzo di Distinct con un comparatore? Il risultato sarà lo stesso? – Jeremy

+0

@Jeremy: Sì, il risultato è lo stesso - DistinctBy è solo più facile :) –

0

Un po 'comvoluted, ma questo sembra funzionare così:

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

Pick-a-vincitore classico.

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