【问题标题】:What is the best way to enumerate bitmask Flags contained within a value?枚举值中包含的位掩码标志的最佳方法是什么?
【发布时间】:2015-03-27 20:46:04
【问题描述】:

我正在使用一个旧的(>15 年)系统,该系统使用 char[] 数组存储属性,如果索引有一个“X”,则该属性被激活。我已经做了很多来转换它:

...

[Flags]
public enum PDMObjectFlags {
    None    = 0,     // 000000
    OptionA = 1,     // 000001
    OptionB = 2,     // 000010
    OptionC = 4,     // 000100
    OptionD = 8,     // 001000
    OptionE = 16,    // 010000
    OptionF = 32     // 100000
}

...

string userOptionsStr = "   XXX";           // "   XXX"
string userOptionsBin = userOptions
                       .Replace('X', '1')
                       .Replace(' ', '0');  // "000111"
int userOptionsInt = 
    Convert.ToInt32(userOptionsBin, 2);     // 7

我怎样才能得到可以显示所有特定用户属性的东西?像这样的:

foreach (var x in userOptionsList){
    Console.Write("John's account has " + x);
}

// Output:
// 
// John's account has OptionA
// John's account has OptionB
// John's account has OptionC

对不起,如果这个例子是愚蠢的,我只是在这里打出来的。它最终会与模型一起传递到 Razor View 并在页面上迭代。

谢谢!

【问题讨论】:

    标签: c# asp.net-mvc razor enums bitmask


    【解决方案1】:

    一旦你把它作为一个整数,你可以转换回枚举并使用ToString() 来提取名称列表。

    给定枚举定义为(编译):

    [Flags]
    public enum PDMObjectFlags {
        None     = 0,    // 000000
        A = 1,    // 000001
        B = 2,    // 000010
        C = 4,    // 000100
        D = 8,    // 001000
        E = 16,   // 010000
        F = 32    // 100000
    }
    

    您可以使用以下方式扩展您的代码:

    PDMObjectFlags flags = (PDMObjectFlags)userOptionsInt;  
    var names = flags.ToString().Split(new[] {',',' '}, StringSplitOptions.RemoveEmptyEntries);
    
    foreach(var name in names)
        Console.WriteLine("John\'s account has Option {0}", name);
    

    这将打印您指定的输出,即:

    约翰的帐户有选项 A

    约翰的帐户有选项 B

    约翰的帐户有选项 C

    【讨论】:

    • 完美!谢谢!我知道我非常接近。 :) 如果我有代表,我会 +。我会尽快接受。
    • @ReedCopsey MSDN 声明“返回值是一个字符串,其中包含 delimiter-separated 常量名称列表”。使用,安全吗?
    • @AlexD 使用的分隔符是逗号。
    • @ReedCopsey 无论区域设置如何,对吗?
    • @AlexD 是的,我相信它总是使用逗号 - 但如果需要,我会验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多