我正在运行以下表达式以根据 Id
获取 2 个集合之间的增量,并确保总体结果仅包含“事件/启用”记录:
//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
。真正令人困惑的部分是我在应用程序的另一部分对其他 2 个集合使用了完全相同的表达式并且它有效。我找回了所有正确的记录,它们都被标记为 .IsEnabled == true
这对我来说毫无意义。我什至复制过来,但它不起作用。
但是,如果我改为两步流程,我会得到我想要的结果:
//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
的记录有什么不正确?
最佳答案
我认为您的括号不在您认为的位置。具体来说,a.IsEnabled
位于 Any
语句内,然后被取反。
allRecordsFromB.Any(b => ((b.Id == a.Id) && a.IsEnabled))
这为您提供了与第二个示例截然不同的逻辑。我会将 a.IsEnabled
移动到您的 Where
的开头,并删除一些不必要的括号以澄清问题。
var newRecords = allRecordsFromA.Where(a => a.IsEnabled &&
!allRecordsFromB.Any(b => b.Id == a.Id)).ToList();
请注意,如果您有大型数据集,或者认为以下方法会更清晰,您可以通过制作 b.Id
的哈希集来加快处理速度。 (或者通过某种连接,在内部会做同样的事情)
var bIds = new HashSet<int>(allRecordsFromB.Select(b => b.Id));
var newRecords = allRecordsFromA.Where(a => a.IsEnabled &&
!bIds.Contains(a.Id)).ToList();
关于c# - 无法弄清楚为什么 collection 会为 bool 属性返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23584928/