如何在自定义对象列表中查找具有特定 [Flags] 枚举值的元素
How to find elements in a list of custom objects that have specific value of [Flags] enum
鉴于此枚举:
[Flags]
public enum Result
{
None = 0,
Draw = 1 << 0,
Win = 1 << 1,
Loss = 1 << 2,
NotLost = Draw | Win,
NotWon = Draw | Loss,
Any = Draw | Win | Loss
}
和这个 class:
public class Match
{
public Result Result { get; }
...
}
如何获取对象 Match
的列表,其中 属性 Result
在 List<Match> matches
中具有标志 NotWon
?
我试过 matches.FindAll(m => m.Result.HasFlag(Result.NotWon));
但它始终是空的,而 matches.FindAll(m => m.Result.HasFlag(Result.Loss));
按预期工作。
|
运算符是 按位 或,而不是逻辑或。因此 NotWon
表示“设置 both Draw 和 Loss 位的值”。
NotWon
= Draw | Loss
= (1 << 0) | (1 << 2)
= 1 | 4
= 0b0001 | 0b0100
= 0b0101
= 5
.
因为 Enum.HasFlag
is a shorthand for this & flag == flag
,如果 m.Result
设置了两个位,它只会评估为 true
。如果仅设置其中一个位,它将评估为 false。
我能想到的有两种方法可以得到你想要的:
- 从枚举中删除
Not...
个案例。只需检查是否设置了您不想要的标志,然后反转结果,即 matches.FindAll(m => !m.Result.HasFlag(Result.Win))
.
- 使用
Not...
个案例作为 掩码 并检查 non-zero,例如matches.FindAll(m => (m.Result & Result.NotWon) != 0)
.
鉴于此枚举:
[Flags]
public enum Result
{
None = 0,
Draw = 1 << 0,
Win = 1 << 1,
Loss = 1 << 2,
NotLost = Draw | Win,
NotWon = Draw | Loss,
Any = Draw | Win | Loss
}
和这个 class:
public class Match
{
public Result Result { get; }
...
}
如何获取对象 Match
的列表,其中 属性 Result
在 List<Match> matches
中具有标志 NotWon
?
我试过 matches.FindAll(m => m.Result.HasFlag(Result.NotWon));
但它始终是空的,而 matches.FindAll(m => m.Result.HasFlag(Result.Loss));
按预期工作。
|
运算符是 按位 或,而不是逻辑或。因此 NotWon
表示“设置 both Draw 和 Loss 位的值”。
NotWon
= Draw | Loss
= (1 << 0) | (1 << 2)
= 1 | 4
= 0b0001 | 0b0100
= 0b0101
= 5
.
因为 Enum.HasFlag
is a shorthand for this & flag == flag
,如果 m.Result
设置了两个位,它只会评估为 true
。如果仅设置其中一个位,它将评估为 false。
我能想到的有两种方法可以得到你想要的:
- 从枚举中删除
Not...
个案例。只需检查是否设置了您不想要的标志,然后反转结果,即matches.FindAll(m => !m.Result.HasFlag(Result.Win))
. - 使用
Not...
个案例作为 掩码 并检查 non-zero,例如matches.FindAll(m => (m.Result & Result.NotWon) != 0)
.