732 votes

Utiliser LINQ pour obtenir des éléments dans une liste <>, qui ne sont pas dans une autre Liste <>

Je suppose qu’il y a une simple requête LINQ pour ce faire, je ne sais pas exactement comment. Consultez l’extrait de code ci-dessous, le commentaire explique ce que je voudrais faire :

1235voto

Klaus Byskov Pedersen Points 43779
var result = peopleList2.Where(p => !peopleList1.Any(p2 => p2.ID == p.ID));

549voto

CodesInChaos Points 60274

Si vous remplacez l'égalité des Personnes, alors vous pouvez aussi utiliser:

peopleList2.Except(peopleList1)

Except devrait être nettement plus rapide que l' Where(...Any) variante car il peut mettre le deuxième de liste dans une table de hachage. Where(...Any) a un temps d'exécution de l' O(peopleList1.Count * peopleList2.Count) tandis que les variantes basées sur HashSet<T> (ou presque) ont un temps d'exécution de O(peopleList1.Count + peopleList2.Count).

Except implicitement supprime les doublons. Cela ne devrait pas affecter votre cas, mais il pourrait être un problème pour des cas similaires.

Ou si vous le souhaitez code rapide, mais ne veulent pas pour remplacer l'égalité:

var excludedIDs = new HashSet<int>(peopleList1.Select(p => p.ID));
var result = peopleList2.Where(p => !excludedIDs.Contains(p.ID));

Cette variante ne permet pas de supprimer les doublons.

37voto

Michael Goldshteyn Points 24679

Étant donné que toutes les solutions à ce jour utilisée couramment syntaxe, voici une solution dans la syntaxe d’expression de requête, pour ceux qui s’intéressent :

Je pense que c’est assez différent des réponses données à être intéressant pour certains, même pensé il plus probable serait pas optimale pour les listes. Maintenant pour les tables avec IDs indexées, ce serait certainement la voie à suivre.

0voto

Brian Quinn Points 1

Voici un exemple de travail qui l’obtiennent les compétences qui n’a pas déjà un candidat du travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X