0

我有一种方法可以通过 LINQ 限制列表中的项目。该列表包含具有两个布尔属性的项目:bool_a 和 bool_b。该列表包含 bool_a 为 true 且 bool_b 为 false 的项目以及两者均为 false 的项目。

我的期望是,一旦我限制了列表,只有 bool_a 为 false 的记录将保留,而 bool_a 和 bool_b 均为 false 的所有项目将被删除。但是,我发现所有项目都被删除了。就好像 AND 运算符的行为类似于 OR。

下面是一个例子。我没看到什么?

var records = GetRecords();
var count_where_a_before = records .Where(x => x.bool_a); // 100 items
var count_where_ab_before = records .Where(x => x.bool_a && x.bool_b); // 10 items
records = records.Where(x => !x.bool_a && !x.bool_b);
var count_where_a_after = records .Where(x => x.bool_a); // 0 items

从上面可以看出,我一直在 where 子句之前和之后使用计数来评估列表。

4

4 回答 4

3

这条线

records = records.Where(x => !x.bool_a && !x.bool_b);

结果记录中只有具有 !x.bool_a 的项目,因此逻辑上下一行没有 x.bool_a 项目。

这是真的,因为您声明所有 x.bool_b 都是错误的,因此该声明实际上与以下内容没有什么不同:

records = records.Where(x => !x.bool_a);

编辑:

如果您想要 bool_a 为 true 且 bool_b 为 false 的所有记录,您应该能够使用此查询:

records = records.Where(x => x.bool_a && !x.bool_b);
于 2012-10-16T21:34:01.090 回答
1

如果要删除所有项目,其中 bool_a 和 bool_b 都是假的,你需要

records = records.Where(x => x.bool_a || x.bool_b);
于 2012-10-16T21:40:19.070 回答
0

您使用的以下过滤器将只留下 A 和 B 均为 FALSE 的项目:

records = records.Where(x => !x.bool_a && !x.bool_b);

如果您只想保留 A 为真且 B 为假的记录,请使用:

records = records.Where(x => x.bool_a && !x.bool_b);

最后,您要检查的是 A = TRUE 的记录数:

var count_where_a_after = records .Where(x => x.bool_a);

确保这是您想要检查的。

于 2012-10-16T21:35:43.330 回答
-1

尝试:

var records = GetRecords().Where(!(x => x.bool_a && x.bool_b)); 
于 2012-10-16T21:32:42.207 回答