我运行下面的表达式来获得基础上,Id
2个集,并确保总的结果只包括“主动/启用”记录之间的三角洲:找不到为什么collection为bool属性返回false?
//Returns the right records but all IsEnabled = false
var newRecords = allRecordsFromA.Where(a => !(allRecordsFromB.Any(b => ((b.Id == a.Id) && a.IsEnabled)))).ToList();
上述结果返回所有的权利A
中的记录不在B
,,但是的所有记录均标记为IsEnabled = false
。真正令人困惑的部分是我在应用程序的另一部分中使用精确相同的表达式,并且它工程。我找回所有正确的记录,他们都被标记为.IsEnabled == true
这对我来说毫无意义。我甚至复制过,它不起作用。
不过,如果我更改为2步过程中,我得到的结果我的愿望:
//Works
var newRecords = allRecordsFromA.Where(a => !(allRecordsFromB.Any(b => (b.Id == a.Id)))).ToList();
var results = newRecords.Where(x => x.IsEnabled).ToList();
我想操作的顺序在第一表达是错误的返回与!
记录被应用到IsEnabled
但我没看到它。在我的第一个表达式中使用IsEnabled == false
返回记录的内容不正确?
非常坚实的答案和非常有用的 - 正是我想要解释的,谢谢。你能解释一下为什么'HashSet'表现更好,它做了什么?是因为我只是在用一组ID而不是完整的打击集合,而这些集合的属性并不是公式的一部分,只是膨胀的东西?有时候我正在处理大集合,所以我可能会这样做。 – atconway
插入你的表达式之后ReSharper提供了它认为甚至是简化的表达式(但是我知道你做过与我的OP直接比较) - 这只是一个简单的表达式:var newRecords = allRecordsFromA.Where( a => a.IsEnabled && allRecordsFromB.All(b => b.Id!= a.Id))。ToList();'有没有评论你是否会这样做? – atconway
@atconway解释一个HashSet:想象一下,如果你打印出一个ID的排序列表,而不是以任何特定方式排序的ID列表。不需要搜索列表中的每个项目,您都可以通过查找附近的区域来快速找到某个数字是否在列表中。这就像在'HashSet'中做一个'Contains',而在列表中则是'Contains'。更详细的/准确的描述可以[在这里找到](http://stackoverflow.com/a/4558802/781792)。 –