LINQ除了如何工作?

时间:2012-09-18 14:52:37

标签: linq except

  

可能重复:
  LINQ find differences in two lists

我想找到2系列之间的区别。所以我在LINQ语句中使用Except。但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);

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

修改

我想我的问题并不清楚。我不关心哪个集合包含什么。我只是想找到两个系列之间的区别。我怎么能这样做?

3 个答案:

答案 0 :(得分:45)

取自101 LINQ Samples

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

答案 1 :(得分:10)

  

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

这是正确的。

2.2存在于第一个集合中,因此无需返回。

它与数组的长度无关。

答案 2 :(得分:5)

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

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);