c# - 按位标志和 Switch 语句?

标签 c# enums switch-statement bit-manipulation

我有以下代码(示例),我真的不喜欢这么多“如果”检查:

public enum Flags 
{
    p1 = 0x01,  // 0001
    p2 = 0x02,  // 0010  
    p3 = 0x04,  // 0100
    p4 = 0x08   // 1000
};      

public static void MyMethod (Flags flag)
{
    if ((flag & Flags.p1) == Flags.p1)
        DoSomething();

    if ((flag & Flags.p2) == Flags.p2)
        DosomethingElse();

    if ((flag & Flags.p3) == Flags.p3)
        DosomethingElseAgain();

    if ((flag & Flags.p4) == Flags.p4)
        DosomethingElseAgainAndAgain();
}

MyMethod(Flags.p1 | Flags.p3);

有什么方法可以让我使用“switch”语句。也许如果我将它们转换为字符串,或使用数组?

最佳答案

是这样的吗?

public static void MyMethod(Flags flag)
{
    // Define action-lookup
    var actionsByFlag = new Dictionary<Flags, Action>
    {
        { Flags.p1, DoSomething},
        { Flags.p2, DosomethingElse},
        { Flags.p3, DosomethingElseAgain},
        { Flags.p4, DosomethingElseAgainAndAgain},
    };

    // Find applicable actions
    var actions = actionsByFlag.Where(kvp => (flag & kvp.Key) == kvp.Key)
                               .Select(kvp => kvp.Value);

    //Execute applicable actions
    foreach (var action in actions)
       action();
}

编辑:如果操作顺序很重要,则可能需要 OrderBy 子句。

关于c# - 按位标志和 Switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3846979/

相关文章:

c# - 生成自动递增字符串主键的存储过程

c# - 在 C# 中比较两个字典的相等数据?

c# - 无法将字符串转换为我创建的枚举类型

go - 在 switch 语句中映射覆盖

java - 如何在我的主类中创建一个 switch 语句,当选择该情况时将在我的程序中运行另一个主类?

c# - 如何将格式化的电子邮件地址解析为显示名称和电子邮件地址?

c# - 如何在 C# 中使用 StreamReader 从特定位置读取文件?

MySQL CASE EnumInt WHEN Varchar ELSE Int 返回为 BLOB - 如何转换为 Varchar?

java - 带有字符串的 switch 语句中需要常量表达式错误

ios - 在切换案例中声明UI对象