it-swarm.com.de

Mit LINQ den Unterschied zwischen zwei Listen ermitteln

Ich habe zwei Listen und muss sie vergleichen und nur eine Liste von Elementen zurückgeben, die nicht in beiden enthalten sind.

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"}
};

In diesem Beispiel wäre new Person {Id = 3, Name = "Person 3"} das Ergebnis . Eine Linq-Lösung wäre zu bevorzugen.

26
gulbaek

wird nicht für dich arbeiten

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

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

Sie können nach weiteren Einzelheiten suchen: SQL nach LINQ (Fall 7 - Filtern von Daten mithilfe der Klausel IN und NOT IN)

38
Pranay Rana

Sie können auch Lambda verwenden:

var query = persons.Where(item => !listOfIds.Contains(item.Id));
33
Mohamed Abed
var list1 = new List<int> {1,2,3,4,5};
var list2 = new List<int> {2,3,4,5,6};

list1.Except(list2); //1 - items removed
list2.Except(list1); //6 - items added
4
Kris Kilton

Mit Linq in C # können Sie die folgenden Varianten ausführen, die dieselben Ergebnisse ergeben:

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