38

可能重复:
LINQ 在两个列表中查找差异

我想找到两个系列之间的区别。所以我Except在 LINQ 语句中使用。但Except似乎只有当第一个集合比第二个集合长时才有效。例如,即使 2 个集合不同,这也不会返回任何结果。

double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers2.Except(numbers1);

任何人都可以确认是否是这种情况?如果是这样,我是否必须在编写查询之前检查集合长度,因为我不知道在编译时哪个集合会更大。

编辑

我想我的问题并不清楚。我不在乎哪个集合包含什么。我只想找到两个集合之间的区别。我怎样才能做到这一点?

4

3 回答 3

61

取自101 个 LINQ 样本

int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
int[] numbersB = { 1, 3, 5, 7, 8 }; 

IEnumerable<int> aOnlyNumbers = numbersA.Except(numbersB); 

Console.WriteLine("Numbers in first array but not second array:"); 
foreach (var n in aOnlyNumbers) 
{ 
    Console.WriteLine(n); 
}

结果

第一个数组但不是第二个数组中的数字:0 2 4 6 9

于 2012-09-18T15:05:45.883 回答
11

例如,这不会返回任何结果...

这是正确的。

2.2存在于第一个集合中,因此没有什么可以返回。

它与数组的长度无关。

于 2012-09-18T15:05:34.823 回答
7

其他答案告诉您如何从另一组中删除一组数字。阅读您的问题,我认为您想要第一个而不是第二个的内容,反之亦然:

var numbers1 = new [] { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
var numbers2 = new [] { 2.2, 2.8 };

var intersect = numbers1.Intersect(numbers2);
var diff = numbers1.Concat(numbers2).Except(intersect);
于 2012-09-18T15:25:02.520 回答