首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >位标志和Switch语句?

位标志和Switch语句?
EN

Stack Overflow用户
提问于 2010-10-03 02:19:49
回答 2查看 8.6K关注 0票数 9

我有以下代码(示例),我真的不喜欢这么多的'if‘检查:

代码语言:javascript
运行
复制
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‘语句。也许我可以将它们转换为字符串,或者使用数组?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-03 02:26:09

像这样的东西?

代码语言:javascript
运行
复制
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子句。

票数 9
EN

Stack Overflow用户

发布于 2010-10-03 02:39:00

以下是Ani答案的一个变体:

代码语言:javascript
运行
复制
public static void MyMethod(Flags flag) 
{ 
    // Define action-lookup 
    var dict = new Dictionary<Flags, Action> 
    { 
        { Flags.p1, DoSomething}, 
        { Flags.p2, DosomethingElse}, 
        { Flags.p3, DosomethingElseAgain}, 
        { Flags.p4, DosomethingElseAgainAndAgain}, 
    }; 

    // Find applicable actions 
    var actions = from value in Enum.GetValues(typeof(Flags))
                  where flag.HasFlag(value)
                  select dict[value];

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

这里的重要区别在于,它迭代枚举中定义的值,而不是字典中的条目。这样,如果在没有添加到字典的情况下向枚举添加新标志,则在尝试使用新标志时会出现异常。它总是按照标志的顺序迭代。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3846979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档