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;} }
3 Réponses :
une option, en utilisant distinctBy code> de Morelinq :
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 :)
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();
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())