2008-10-21 3 views
3

Je viens de commencer à apprendre des expressions linq et lambda, et elles semblent être un bon moyen de trouver des doublons dans une collection d'objets complexes, mais je reçois un peu confus et j'espère que quelqu'un peut m'aider à me remettre sur le chemin du codage heureux.Recherche de doublons dans un objet complexe en utilisant l'expression Linq ou Lambda

Mon objet est structuré comme list.list.uniqueCustomerIdentifier

je dois assurer qu'il n'y a pas de double uniqueCustomerIdentifier avec dans l'ensemble de l'objet complexe. S'il y a des doublons, je dois identifier ceux qui sont en double et renvoyer une liste des doublons.

Répondre

9
  • Déballez la hiérarchie
  • projet chaque élément à sa propriété uniqueID
  • Groupe ces des années ID jusqu'à
  • Filtrer les groupes par des groupes qui ont plus de 1 élément
  • projet chaque groupe à la clé du groupe (retour à uniqueID)
  • Énumérer la requête et stocker le résultat dans une liste.

var result = 
    myList 
    .SelectMany(x => x.InnerList) 
    .Select(y => y.uniqueCustomerIdentifier) 
    .GroupBy(id => id) 
    .Where(g => g.Skip(1).Any()) 
    .Select(g => g.Key) 
    .ToList() 
+3

Vous pouvez sauter .Choisir (y => y.uniqueCustomerIdentifier) ​​et utiliser .GroupBy (y => y.uniqueCustomerIdentifier) ​​à la place. – Lucas

2

Il existe un opérateur linq Distinct(), qui vous permet de filtrer vers un ensemble d'enregistrements distinct si vous ne voulez que les identifiants. Si vous avez configuré votre classe à redéfinir égale ou vous avez un IEqualityComparer, vous pouvez appeler directement la méthode d'extension Distinct pour renvoyer les résultats uniques de la liste. En bonus, vous pouvez également utiliser les méthodes Union et Intersection pour fusionner ou filtrer entre deux listes.

Une autre option consisterait à grouper par id, puis à sélectionner le premier élément.

var results = from item in list 
       group item by item.id into g 
       select g.First(); 
0

Si vous voulez aplatir les deux hiérarchies de liste, utilisez la méthode SelectMany pour aplatir un IEnumerable<IEnumerable<T>> en IEnumerable<T>.

Questions connexes