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

获取c中的公共标志枚举值#

  •  1
  • SP1  · 技术社区  · 6 年前

    假设我有下面的枚举

    [Flags]
    enum Letters
    {
         A = 1,
         B = 2,
         C = 4,
         D = 8,
         E = 16,
         F = 32,
         AB = A | B,
         All = A | B | C,
    }
    

    如果我有变量:

    var s = Letters.A | Letters.B | Letters.D;
    var p = Letters.A | Letters.C | Letters.D | Letters.E;
    

    我想得到这两个枚举之间的公共值,因此在本例中应该是 A | D . 有人能告诉我怎样才能做到这一点吗。

    谢谢

    4 回复  |  直到 6 年前
        1
  •  7
  •   Mark PM    6 年前

    您可以使用binary&(and)运算符获得:

    var s = Letters.A | Letters.B | Letters.D;
    var p = Letters.A | Letters.C | Letters.D | Letters.E;
    var sAndp = s & p; // This will give you only the common values ( A & D)
    
        2
  •  1
  •   Rufus L    6 年前

    就像你用的一样 | 要获得值的联合,可以使用 & 要到达十字路口:

    var s = Letters.A | Letters.B | Letters.D;
    var p = Letters.A | Letters.C | Letters.D | Letters.E;
    
    var intersection = s & p;  // A | D
    var union = s | p;         // All | D | E
    
        3
  •  1
  •   Eugene    6 年前

        var result =  s & p;
    
        4
  •  0
  •   MistyK    6 年前

    如果这适合你,它会返回单个标志的列表

     static IEnumerable<Enum> GetFlags(Enum input)
        {
            foreach (Enum value in Enum.GetValues(input.GetType()))
                if (input.HasFlag(value))
                    yield return value;
        }
    
    GetFlags(s).Intersect(GetFlags(p))