使用LINQ获得两个列表之间的差异

问题描述 投票:27回答:4

我有两个列表,我需要将它们进行比较,并且只返回不在两个列表中的项目列表。

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

在此示例中为new Person {Id = 3, Name = "Person 3"}。最好使用Linq解决方案。

c# .net linq list
4个回答
39
投票

不参加将对您有用

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

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

您可以查看更多详细信息:SQL to LINQ ( Case 7 - Filter data by using IN and NOT IN clause)


34
投票

您也可以使用lambda:

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

5
投票
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

1
投票

使用C#中的Linq,您可以执行以下给出相同结果的变体:

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
投票

LINQ现在具有一个名为Except的功能,它将为您实现减号。

var a = new List<string>(){"A","B","C", "X", "Y"};
var b = new List<string>(){"B", "C"};
a.Except(b).Dump(); // Dump is a LinqPad function that prints "A", "X", "Y"
© www.soinside.com 2019 - 2024. All rights reserved.