2010-02-19 22 views
9

Ich habe zwei Listen von Objekten, mit Linq möchte ich sie zusammenführen, aber wo die zwei Listen Objekte mit dem gleichen Schlüssel enthalten, möchte ich nur die mit dem größten LastUpdated Value.Verwenden von LINQ zum Zusammenführen einer Liste von Objekten

Ich dachte, dass ich irgendwie eine Liste Gruppierung von Schlüsseln eines mit max (Lastupdated), dann kommen Sie zurück zur Liste Verbindung auf Schlüssel und Lastupdated bekommen konnte, aber es muss eine effizientere Art und Weise sein ...

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

Antwort

17

Eine Option, mit DistinctBy von MoreLINQ:

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

Wie unterscheidet sich die DistinctBy von der Verwendung von Distinct mit einem Vergleich? Wird das Ergebnis dasselbe sein? – Jeremy

+0

@ Jeremy: Ja, das Ergebnis ist das gleiche - DistinctBy ist einfach einfacher :) –

0

Ein bisschen comvoluted, aber das scheint auch zu funktionieren:

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

Klassische Pick-a-Gewinner.

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