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 除了如何工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
除了一键复制粘贴,“软件机器人”还能自动完成这些电脑操作...
由于 .net-core 中的 linq-statement 导致 IEnumerable 和 List 之间出现意外差异? [复制]