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

在C的枚举中设置#

  •  5
  • Vaccano  · 技术社区  · 15 年前

    我想找到一种方法来检查变量中是否包含一组值。

    [Flags]
    public enum Combinations
    {
        Type1CategoryA = 0x01,      // 00000001
        Type1CategoryB = 0x02,      // 00000010
        Type1CategoryC = 0x04,      // 00000100
        Type2CategoryA = 0x08,      // 00001000
        Type2CategoryB = 0x10,      // 00010000
        Type2CategoryC = 0x20,      // 00100000
        Type3 = 0x40                // 01000000
    }
    
    bool CheckForCategoryB(byte combinations)
    {
    
        // This is where I am making up syntax
    
        if (combinations in [Combinations.Type1CategoryB, Combinations.Type2CategoryB])
            return true;
        return false;
    
        // End made up syntax
    }
    

    我是从Delphi移植到.NET的。这是用Delphi编写的相当容易的代码,但我不知道如何用C语言编写。

    3 回复  |  直到 12 年前
        1
  •  16
  •   Marc Gravell    15 年前

    如果您的意思是“至少有一个旗子”:

    return (combinations
         & (byte)( Combinations.Type1CategoryB | Combinations.Type2CategoryB)) != 0;
    

    另外-如果你把它声明为 Combinations combinations (而不是 byte )您可以删除 (byte)

    bool CheckForCategoryC(Combinations combinations)
    {
        return (combinations & (Combinations.Type1CategoryB | Combinations.Type2CategoryB) ) != 0;
    }
    

    如果你的意思是“恰好是其中之一”,我会用 switch if 等。

        2
  •  1
  •   Maxime Rouiller    15 年前

    为了更简单地“检查”这些值,您可能需要检查 Umbrella 在codeplex上。他们为验证枚举上的位标志构建了一些不错的扩展方法。是的,这是一个抽象,但我认为我们应该更关注可读性,而不是实现本身。

    享受。

        3
  •  -2
  •   CaffGeek    15 年前

    我这样想,如果我正确理解这个问题

    if (combinations == Combinations.Type1CategoryB | Combinations.Type2CategoryB)