9
votes

Utilisation de LINQ pour fusionner une liste d'objets

J'ai deux listes d'objets, à l'aide de Linq, je voudrais les fusionner, mais où les deux listes contiennent des objets avec la même clé, je veux seulement celui avec la plus grande valeur lâblée.

Je pensais que je pouvais d'une manière ou d'une autre, obtenez une liste de regroupement de liste par clé A avec max (LastUpdatedated), puis rejoignez la liste de rejoindre sur la touche et la mise en valeur, mais il doit y avoir un moyen plus efficace ... P>

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


0 commentaires

3 Réponses :


17
votes

une option, en utilisant distinctBy de Morelinq : xxx


2 commentaires

Comment le distincte est-il différent de l'utilisation distincte avec un comparateur? Le résultat sera-t-il le même?


@Jeremy: Oui, le résultat est le même - distincte est simplement plus facile :)



0
votes

Un peu comvoluté, mais cela semble fonctionner aussi bien:

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 commentaires

2
votes

Pick-A-gagnant classique.

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


0 commentaires