0

我有这样的情况:

拿到enum

enum MyType{
    None = 0,
    First = 1,
    Second = 2,
    Third = 4,
    //and so on 
}

现在我不想检查给定的数字是否是二进制总和的结果,例如

int givenNumber = 3;
int result = 
//how to get that it's sum of 2 enums in this particular case would be (int)Type.First & (int)Type.Second == 3;

希望我的问题足够清楚,有人可以提供帮助。

编辑

  1. 枚举值始终由 2 供电

  2. 我想编写一个方法来检查给定的数字是否可以是不同二进制和示例的一部分:int givenNumber = 1; //1 , 3 ,5 and 7 will be the answer

  3. 现实生活中的示例:我的数据库中有承包商,每个承包商都可以是 Producer = 1,Supplier = 2,Service = 4 在 db 我只能存储 1 个值 int 在这种情况下将是最明智的选择。当我将项目加载到我的服务 - 承包商组合框时,我希望加载每一行,例如值 4、5 或 7(因为 7 = 1+2+4、5 = 1+4 和 4=4)。

现在我的问题更清楚了吗?

4

4 回答 4

5

您可以像这样获取单个枚举:

static IEnumerable<MyEnum> GetFlags(this MyEnum e)
{
    var flags = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>();
    foreach (var flag in flags)
        if ((flag & e) > 0) yield return flag;
}

那么你可以像这样使用它:

int givenNumber = 3;
var results = ((MyEnum)givenNumber).GetFlags();
于 2013-02-08T13:22:41.327 回答
1
private enum YourType
{
    None = 0,
    First = 1,
    Second = 2,
    Third = 4,
}

private static void Main(string[] args)
{
    int givenNumber = 3;
    YourType castedNumber = (YourType)givenNumber;

    if ((castedNumber & YourType.First) == YourType.First)
    {
        Console.WriteLine("First");
    }

    if ((castedNumber & YourType.Second) == YourType.Second)
    {
        Console.WriteLine("Second");
    }

    if ((castedNumber & YourType.Third) == YourType.Third)
    {
        Console.WriteLine("Third");
    }

    Console.Read();
}

请注意:

  1. 这不适用于None(0) 值,因此您必须手动检查 0((x & 0)始终为 0)
  2. 所有值必须是 2 的幂
  3. 您可能想要添加该[Flag]属性,以便其他开发人员现在将枚举与按位运算一起使用
于 2013-02-08T13:11:34.030 回答
0
    enum Flag
    {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
        Fourth = 8
    }

    static void Main(string[] args)
    {
        int givenNumber = 3;
        List<Flag> flags = new List<Flag>();

        int number, result;
        do
        {
            int step = 0;
            do
            {
                number = (int)Math.Pow(2d, ++step);
            } while (number < givenNumber);
            result = (int)Math.Pow(2d, step - 1);
            flags.Add((Flag)result);
            givenNumber -= result;
        } while (givenNumber != 0);

        Debugger.Break();
    }
于 2013-02-08T13:35:16.937 回答
0
[Flags]
enum MyType{
  None = 0,
  First = 1,
  Second = 2,
  Third = 4,
  //and so on 
}

使用 Flags 属性意味着一个简单的 toString 将为您提供您想要的下拉菜单

IE

MyType test = (MyType)6;
Console.WriteLine(test.ToString());

现在将打印:

Second, Third

而不是 6

于 2013-02-08T13:54:37.970 回答