1. ホーム
  2. c#

[解決済み] C#でフラグを比較する方法は?

2022-04-26 11:27:31

質問

以下のフラグ列挙型があります。

[Flags]
public enum FlagTest
{
    None = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4
}

if文がtrueと評価されないのですが。

FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;

if (testItem == FlagTest.Flag1)
{
    // Do something,
    // however This is never true.
}

これを真にするにはどうしたらいいのでしょうか?

どのように解決するのですか?

.NET 4 では、新しいメソッド Enum.HasFlag . これを利用すると、書くことができます。

if ( testItem.HasFlag( FlagTest.Flag1 ) )
{
    // Do Stuff
}

の方がずっと読みやすいと思うのですが、いかがでしょうか。

.NETのソースによると、これは合格した答えと同じロジックを実行するようです。

public Boolean HasFlag(Enum flag) {
    if (!this.GetType().IsEquivalentTo(flag.GetType())) {
        throw new ArgumentException(
            Environment.GetResourceString(
                "Argument_EnumTypeDoesNotMatch", 
                flag.GetType(), 
                this.GetType()));
    }

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue());
    // test predicate
    return ((uThis & uFlag) == uFlag); 
}