比较标志与标志 - 检查匹配

Comparing flags with flags - check for matches

假设我有一个枚举:

[Flags]
public enum Alpha
{
    NULL = 0,
    A0 = 1,
    A1 = 2,
    A2 = 4,
    A3 = 8
}

我有以下内容:

Alpha selected = A0 | A1 | A2

Alpha compare = A1 | A3

我想检查 selected 标志是否也在 compare 标志中。

到目前为止我能想到的唯一方法是(伪代码)

foreach(Alpha flag in Enum.GetValues(typeof(Alpha)))
{
    if (selected.HasFlag(flag) && compare.HasFlag(flag))
    {
        return true
    }
}
return false

有没有更合乎逻辑的方法来做到这一点?

因为它被视为位域,所以你可以用同样的方式使用它。

FlagsAttribute Class

Indicates that an enumeration can be treated as a bit field; that is, a set of flags

bool result = (selected & compare) > 0; // First solution
bool result2 = (selected & compare).Any(); // Second solution

你需要的大概是:

(selected & compare) > 0;

当您使用 AND 运算符时,两个操作数之间的任何共同标志都将出现在结果中。

那么你只需要比较一下,看看结果是否大于零:

bool anySelected = (selected & compare) > 0;

我认为首先你应该从 Alpha 中删除 NULL,然后 return (selected & compare) != 0anyEnum.HasFlag(Alpha.NULL) 将永远是正确的。