【问题标题】:C# Flags parsingC#标志解析
【发布时间】:2012-11-07 11:15:23
【问题描述】:

我已经写了枚举:

[Flags]
public enum BundleOS {
    Win32 = 0,
    Win64 = 1,
    Mac = 2
}

我需要从字符串中解析它,然后写入字符串。字符串示例:"Win32|Win64"。 下一个代码返回无效结果:

BundleOS os;
Boolean result = TryParse<BundleOS>("Win32|Win64", out os);

result 变量中,我得到了false 值。但我需要true,并且os 值必须具有BundleOS.Win32|BundleOS.Win64 值。


如果我做这样的操作:

String x = (BundleOS.Win32|BundleOS.Win64).ToString();

我需要得到这样的值:"Win32|Win64",但我得到的是"Win64"

是否存在这些问题的简单解决方案?

【问题讨论】:

    标签: c# parsing flags


    【解决方案1】:

    您的问题是您执行按位运算并且 Win32 等于 0。
    所以Win64 OR Win32实际上是Win64 OR 0,它返回Win64

    你可以像这样设置你的枚举:

    [Flags]
    public enum BundleOS 
    {
         Win32 = 1,
         Win64 = 2,
         Mac = 4
    }
    

    附带说明: 我还要指出本周早些时候在how to define flag enums 上提出的一个非常好的问题。

    【讨论】:

    • 谢谢!我不专心。 :)
    【解决方案2】:

    除了@Blachshma 给出的关于您的特定标志的答案之外,如果您想采用"Win32|Win64" 的字符串形式并将其转换为您的枚举的实际实例,您还有更多工作要做.

    首先,您只需通过 '"|"' split() 字符串来获取各个值。

    然后您可以使用Enum.GetNames()Enum.GetValues() 来获取原始枚举中元素的名称和值的列表。然后,您可以遍历拆分组件,并从原始枚举中找到匹配的条目(及其值)。

    【讨论】:

    • 不,有一个更简单的解决方案:String x = (BundleOS.Win32|BundleOS.Win64).ToString().Replace(", ", "|");
    【解决方案3】:

    试试这个来解析你的标志字符串。我还没有测试,但它应该让你开始:

    BundleOS flags = "Win32|Win64"
                        .Split('|')
                        .Select(s => (BundleOS)Enum.Parse(typeof(BundleOs), s))
                       .Aggregate((f, i) => f|i);
    

    【讨论】:

    • 这应该是答案!但请固定到:"Win32|Win64".Split('|').Select(s =&gt; (BundleOs)Enum.Parse(typeof(BundleOs), s)).Aggregate((f, i) =&gt; f | i);
    【解决方案4】:

    除了 Blachshma 的回答之外,MSDN documentation for the FlagsAttribute 实际上在“FlagsAttribute 和 Enum 指南”部分中解释得非常简洁:

    用2的幂定义枚举常数,即1、2、4、8, 等等。这意味着组合枚举中的各个标志 常量不重叠。

    使用 None 作为标志枚举常量的名称,其值为 零。您不能在按位 AND 中使用 None 枚举常量 用于测试标志的操作,因为结果始终为零。 但是,您可以执行逻辑比较,而不是按位比较 数值和 None 枚举常量来确定 是否设置了数值中的任何位。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      相关资源
      最近更新 更多