1. ホーム
  2. c#

[解決済み] フラグを持つEnumの値を繰り返し処理する方法は?

2022-05-06 18:24:29

質問

フラグ列挙型を保持する変数がある場合、その変数内のシングルビット値に対して何らかの方法で反復処理を行うことは可能ですか?それとも、Enum.GetValues を使用して列挙型列挙型全体を繰り返し、どれが設定されているかをチェックしなければならないのでしょうか?

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

数年後、もう少し経験を積んでから、1ビットの値だけで、最下位ビットから最上位ビットへ移動する場合の私の究極の答えは、Jeff Mercadoの内部ルーチンを少し変形させたものです。

public static IEnumerable<Enum> GetUniqueFlags(this Enum flags)
{
    ulong flag = 1;
    foreach (var value in Enum.GetValues(flags.GetType()).Cast<Enum>())
    {
        ulong bits = Convert.ToUInt64(value);
        while (flag < bits)
        {
            flag <<= 1;
        }

        if (flag == bits && flags.HasFlag(value))
        {
            yield return value;
        }
    }
}

何年か前の反対にもかかわらず、私はここでHasFlagを使っています。ビット単位の比較を使うよりもずっと読みやすく、私がこれからすることにとってはスピードの差は重要ではありません。(その後、HasFlagsの速度が改善された可能性もありますが、私が知る限りでは...テストしていません)。