如何在自定义对象列表中查找具有特定 [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 的列表,其中 属性 ResultList<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。

我能想到的有两种方法可以得到你想要的:

  1. 从枚举中删除 Not... 个案例。只需检查是否设置了您不想要的标志,然后反转结果,即 matches.FindAll(m => !m.Result.HasFlag(Result.Win)).
  2. 使用 Not... 个案例作为 掩码 并检查 non-zero,例如matches.FindAll(m => (m.Result & Result.NotWon) != 0).