【问题标题】:c# flag comparison "only contain" a set [duplicate]c#标志比较“只包含”一个集合[重复]
【发布时间】:2016-12-26 00:34:16
【问题描述】:
[ Flags ]
public enum StatusType { a,b,c,d,e,f,g }

StatusType m_StatusType = a | b;

If ( m_StatusType only contains a and b )  // I need help here
{ 

}

嗨,

我需要一些关于比较标志的帮助。如何知道标志枚举变量是否仅包含某些特定值?

【问题讨论】:

  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。
  • (m_ StatusType & (a | b)) == a | b
  • 关于使用[Flags] 的枚举类型以及如何使用它们的彻底讨论,请参阅标记的副本。如果您发现自己还有一些困惑,请发布一个新问题,其中包含一个很好的minimal reproducible example,清楚地表明您遇到了什么麻烦。描述代码的作用、您希望它做什么以及具体您无法弄清楚的问题。
  • @DVN 那么彼得是对的,你应该阅读这个stackoverflow.com/questions/8447/…

标签: c# enums


【解决方案1】:

首先,在定义一个标志枚举时,每个标志应该代表枚举中的一个位:

enum X { a = 1, b = 2, c = 4, d = 8 }

这也允许您组合标志:

CandD = 12, //has both c and d flags set.

或者如果你有很多:

enum X { 
  a = 1 << 0, 
  b = 1 << 1, 
  c = 1 << 2, 
  d = 1 << 3,
  ...
  CAndD = c | d
}

您可以使用简单的相等比较来测试是否只设置了某些标志。

public bool ContainsOnly(X value, X flags) 
{
     return value == flags;
}

public bool ContainsOnlyCandD(X value) 
{
     return value == (X.c | X.d);
}

public bool ContainsBothCandDButCouldContainOtherStuffAsWell(X value) 
{
     return (value & (X.c | X.d)) == (X.c | X.d);
}

【讨论】:

    【解决方案2】:

    首先,您的标志应该这样创建:

    [Flags]
    public enum StatusType
    {
        None = 0
        A = 1,
        B = 2,
        C = 4,
        D = 8,
        E = 16,
        F = 32,
        G = 64
    }
    

    然后您可以这样分配:

    var statusType = StatusType.A | StatusType.B;
    

    并这样测试它:

    if (statusType.HasFlag(StatusType.A))
    {
        //A is defined
    }
    

    【讨论】:

    • 我只想详细说明为什么这个答案有效,为了 OP 的利益(以及任何未来的人)。这些枚举值中的每一个都被分配了一个二进制值,该值仅包含一个 1,其余为 0。1 = 1, 2 = 01, 4 = 100, 8 = 1000, 16 = 10000, etc| 是按位或运算符,执行1 | 4 之类的操作会产生二进制数101。然后,您可以使用按位和&amp; 比较它们以查看值是否存在。 101 &amp; 10 = 000,但101 &amp; 100 = 100。希望此页面上的其他解释更有意义。
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    相关资源
    最近更新 更多