web-dev-qa-db-fra.com

Obtenez la différence entre deux listes en utilisant LINQ

J'ai deux listes et je dois les comparer et ne renvoyer qu'une liste d'éléments ne figurant pas dans les deux.

var listOfIds = new List<int> {1,2,4};

var persons = new ObservableCollection<Person>
{
    new Person {Id = 1, Name = "Person 1"},
    new Person {Id = 2, Name = "Person 2"},
    new Person {Id = 3, Name = "Person 3"},
    new Person {Id = 4, Name = "Person 4"}
};

Dans cet exemple, new Person {Id = 3, Name = "Person 3"} serait le résultat . Une solution Linq serait préférable.

26
gulbaek

pas dans travaillera pour vous

var listOfIds = new List<int> {1,2,4};

var query = from item in persons 
            where !listOfIds .Contains( item.id )
            select item;

Vous pouvez vérifier pour plus de détails: SQL to LINQ (cas 7 - Filtrer les données en utilisant les clauses IN et NOT IN)

38
Pranay Rana

Vous pouvez aussi utiliser lambda:

var query = persons.Where(item => !listOfIds.Contains(item.Id));
33
Mohamed Abed

Avec Linq en C #, vous pouvez utiliser les variantes suivantes qui donnent les mêmes résultats:

int[] numbers1 = { 1,2,3,4 };
int[] numbers2 = { 3,4,5,6 };

// Ac V Bc, thus complement of A plus the complement of B
IEnumerable<int> differencesVariant1 = 
numbers1.Except(numbers2).Union(numbers2.Except(numbers1));

// (A V b)c, thus complement of (set A plus set B)
IEnumerable<int> differencesVariant2 = 
numbers1.Union(numbers2).Except(numbers1.Intersect(numbers2));

Console.WriteLine("variant 1:");
foreach (int number in differencesVariant1)
    Console.WriteLine(number);   // prints: 1,2,5,6

Console.WriteLine("variant 2:");
foreach (int number in differencesVariant2)
    Console.WriteLine(number);   // prints: 1,2,5,6
0
Robin