使用 linq 查询,我从数据库中检索列表。该列表包含包含属性 RoleType 的特定类的 2 项。RoleType 的类型是 int。
第一个对象的属性值为 0。第二个对象的属性值为 1。
我也有一个枚举:
enum RoleTypes
{
Type1 = 1,
Type2 = 0,
}
索引枚举的奇怪顺序是给定的,我无法改变它。
我的业务规则规定必须有一个 RoleType 值为 Type2 的角色和至少一个 RoleType 值为 Type1 的角色。这是我使用的代码:
var ExactlyOneRoleType2 = roles.Count(role => role.RoleType == (int)RoleTypes.Type2) == 1;
var AtLeastOneRoleType1 = roles.Any(role => role.RoleType == (int)RoleTypes.Type1);
根据我前面提到的列表,两个变量(ExactlyOneRoleType2 和 AtLeastOneRoleType1)都应该为 true。至少,我会这样期待。只有当我通过代码进行调试时,我才发现 ExactlyOneRoleType2 是错误的。经过一番研究,我发现
roles.Count(role => role.RoleType == (int)RoleTypes.Type2)
返回 2 而不是 1,我觉得这很奇怪,因为 RoleType Type2 只有 1 个角色。为什么计数返回 2?它也不计算 Any 调用实际上返回 true 的事实。包含 2 个项目的列表如何同时具有 RoleType Type2 的 2 个项目和 RoleType Type1 的至少一个项目?
另外,当我将计数调用更改为
roles.Count(role => role.RoleType == 0)
它仍然返回 2。仅当我将 Count 调用更改为此:
private static bool IsRoleTypeType2(Role role)
{
return role.RoleType == (int)RoleTypes.Type2;
}
roles.Count(IsRoleTypeType2)
计数应返回 1。
这里发生了什么?为什么当我使用匿名谓词时计数返回 2?我是否误解了谓词在计数情况下的工作方式?还是这是 Linq 中的错误?