代码之家  ›  专栏  ›  技术社区  ›  kofucii

位标志和Switch语句?

  •  8
  • kofucii  · 技术社区  · 14 年前

    我有下面的代码(示例),我对这么多的“if”检查感到非常不舒服:

    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”语句。如果我把它们转换成字符串,或者使用数组?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Ani    14 年前

    像这样的?

    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 可能需要第条。

        2
  •  6
  •   Community CDub    7 年前

    这里有一个关于 Ani 的答案:

    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(); 
    }