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.
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)
Vous pouvez aussi utiliser lambda:
var query = persons.Where(item => !listOfIds.Contains(item.Id));
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