c# - 无法弄清楚为什么 collection 会为 bool 属性返回 false?

标签 c# lambda

我正在运行以下表达式以根据 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/

相关文章:

c# - 无法使用跳跃式手指破坏物体

c# - 代码隐藏中带有转换器的 DataTemplate

c# - 来自同一类型的两个对象的组合键

c# - 获取winform表单的参数(宽度&高度)

python - 在 python 中使用 reduce() 序列化一个字符串

c# - Linq lambda 实体,不包含定义

c# - 如何比较 lambda 表达式与 QueryOver where 限制中的别名属性?

c# - 在 TFS 构建服务器上运行单元测试 Fakes Framework |错误

Python Pandas Dataframe GroupBy Size 基于条件

java - 将命名函数作为参数传递