Je suppose qu'il existe une simple requête LINQ pour ce faire, je ne sais pas exactement comment.
Compte tenu de ce morceau de code:
class Program
{
static void Main(string[] args)
{
List<Person> peopleList1 = new List<Person>();
peopleList1.Add(new Person() { ID = 1 });
peopleList1.Add(new Person() { ID = 2 });
peopleList1.Add(new Person() { ID = 3 });
List<Person> peopleList2 = new List<Person>();
peopleList2.Add(new Person() { ID = 1 });
peopleList2.Add(new Person() { ID = 2 });
peopleList2.Add(new Person() { ID = 3 });
peopleList2.Add(new Person() { ID = 4 });
peopleList2.Add(new Person() { ID = 5 });
}
}
class Person
{
public int ID { get; set; }
}
Je voudrais effectuer une requête LINQ pour me donner toutes les personnes peopleList2
qui ne sont pas dans peopleList1
.
Cet exemple devrait me donner deux personnes (ID = 4 & ID = 5)
Réponses:
Cela peut être résolu à l'aide de l'expression LINQ suivante:
Une autre façon d'exprimer cela via LINQ, que certains développeurs trouvent plus lisible:
la source
Si vous remplacez l'égalité des personnes, vous pouvez également utiliser:
Except
devrait être beaucoup plus rapide que laWhere(...Any)
variante car elle peut mettre la deuxième liste dans une table de hachage.Where(...Any)
a un temps d'exécution deO(peopleList1.Count * peopleList2.Count)
tandis que les variantes basées surHashSet<T>
(presque) ont un temps d'exécution deO(peopleList1.Count + peopleList2.Count)
.Except
supprime implicitement les doublons. Cela ne devrait pas affecter votre cas, mais pourrait être un problème pour des cas similaires.Ou si vous voulez du code rapide mais ne voulez pas remplacer l'égalité:
Cette variante ne supprime pas les doublons.
la source
Equals
avait été remplacé pour comparer les identifiants.Ou si vous le voulez sans négation:
Fondamentalement, il dit obtenir tout de peopleList2 où tous les identifiants dans peopleList1 sont différents de id dans peuplesList2.
Une approche un peu différente de la réponse acceptée :)
la source
Étant donné que toutes les solutions à ce jour utilisaient une syntaxe fluide, voici une solution en syntaxe d'expression de requête, pour les personnes intéressées:
Je pense qu'elle est suffisamment différente des réponses données pour intéresser certains, même si elle est très probablement sous-optimale pour les listes. Maintenant, pour les tables avec des ID indexés, ce serait certainement la voie à suivre.
la source
Un peu tard pour la fête mais une bonne solution qui est également compatible Linq to SQL est:
Félicitations à http://www.dotnet-tricks.com/Tutorial/linq/UXPF181012-SQL-Joins-with-C
la source
La réponse de Klaus a été excellente, mais ReSharper vous demandera de "Simplifier l'expression LINQ":
var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));
la source
Cette extension énumérable vous permet de définir une liste d'éléments à exclure et une fonction à utiliser pour rechercher la clé à utiliser pour effectuer la comparaison.
Vous pouvez l'utiliser de cette façon
la source
Voici un exemple de travail qui acquiert des compétences informatiques qu'un candidat à un emploi ne possède pas déjà.
la source
tout d'abord, extrayez les identifiants de la collection où condition
deuxièmement, utilisez l'estament "compare" pour sélectionner des identifiants différents de la sélection
Évidemment, vous pouvez utiliser x.key! = "TEST", mais ce n'est qu'un exemple
la source
Une fois que vous avez écrit un FuncEqualityComparer générique, vous pouvez l'utiliser partout.
la source