LINQ 除了如何工作? [复制]

Posted

技术标签:

【中文标题】LINQ 除了如何工作? [复制]【英文标题】:How does LINQ Except work? [duplicate] 【发布时间】:2012-09-10 20:46:10 【问题描述】:

可能重复:LINQ find differences in two lists

我想找出两个系列之间的区别。所以我在 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);

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

编辑

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

【问题讨论】:

我不确定这里发生了什么 - 但似乎有人对问题/答案投了反对票。 差异怎么回事? Except 不对称。您是否正在寻找 A.Difference(B) 返回 A 中不在 B 中的所有内容在 B 中但不在 A 中的所有内容......或者您是否在寻找其他东西?跨度> 我在这里找到了我的问题的答案:***.com/questions/2404301/… 【参考方案1】:

取自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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

没错。

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

它与数组的长度无关。

【讨论】:

他们误解了它的工作原理,他们期望它从 A 和 B 返回不相等的项目,所以如果 A 是 1,2 而 B 是 2,3他们期望除了返回 1, 3 MSDN 网站上的措辞是模棱两可的

以上是关于LINQ 除了如何工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我如何在这里使用 LINQ 聚合? [复制]

除了一键复制粘贴,“软件机器人”还能自动完成这些电脑操作...

关于linq的效率问题

LINQ except() 的意外行为

由于 .net-core 中的 linq-statement 导致 IEnumerable 和 List 之间出现意外差异? [复制]

包括工作,但加入不工作 c# linq