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

39
我有两个列表,需要比较它们,并返回仅包含未同时存在于两个列表中的项目的列表。
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 解决方案。
4个回答

45

1
非常感谢,总是忘记如何做 :-) - gulbaek
3
有一个名为Except的函数可以实现此功能,它不仅更为简洁,而且速度更快。 - BlueRaja - Danny Pflughoeft

40
你也可以使用lambda函数:
var query = persons.Where(item => !listOfIds.Contains(item.Id));

27
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接