繁体   English   中英

C#中是否有模式或方法来检查(int 1,2,4,8,...)选项是真还是假

[英]Is there a pattern or a method in C# to check if an (int 1,2,4,8,…) option is true or false

我喜欢写枚举或整数来传递我的方法选项。 C#中是否有模式或方法来检查(int 1,2,4,8,...)选项是真还是假。 我认为应该可以通过二进制函数轻松实现。

class Program
{
    public enum Option
    {
        Option_A = 1,
        Option_B = 2,
        Option_C = 4,
        Option_D = 8,
    }

    static void Main(string[] args)
    {
        int activeOption = 5; // Means I activeted the Option_A and Option_C
        if (IsOption(activeOption, Option.Option_A)) { /*do work*/ }
        if (IsOption(activeOption, Option.Option_B)) { /*do work*/ }
        if (IsOption(activeOption, Option.Option_C)) { /*do work*/ }
        if (IsOption(activeOption, Option.Option_D)) { /*do work*/ }
    }

    private static bool IsOption(int activeOption, Option option)
    {
        /*Evaluate if IsOption is true or false*/
        throw new NotImplementedException();
    }
}

编辑

我是否限制了我可以创建的选项数量?

由于你的枚举包含标志(或者如你所愿,是一个位域),你应该为它添加一个FlagsAttribute

[Flags]
public enum Option
{
    Option_A = 1,
    Option_B = 2,
    Option_C = 4,
    Option_D = 8,
}

然后,检查通常使用按位和运算符完成。 还需要强制转换,因为您使用的是int变量。

if(((Option)activeOption & Option.Option_A) != Option.Option_A) //...

如果你想把这种肮脏的东西封装起来,请查看Smudge202答案中链接的文章。 如果您运行的是.NET 4,则甚至不需要这样做:检查sehe的答案

但是您应该尝试直接使用Option类型的变量,并将选项与按位或运算符组合使用:

Option activeOption = Option.Option_A | Option.Option_C;

当然,使用此方案会限制您可以创建的选项数量。 如果按原样保留,则只能创建32个不同的选项,因为int (枚举的默认基础类型)只有32位。 如果你使用long你可以有64种不同的选择:

[Flags]
public enum Option : long
{
    Option_A = 1,
    Option_B = 2,
    Option_C = 4,
    Option_D = 8,
    // blah blah
}

但是,如果您需要任意数量的选项,则可能需要更改策略。 您可以创建一个行为类似于枚举的自定义类型,但只使用常规的非标志枚举和HashSet<Option> ,您可能会更好。

public enum Option
{
    Option_A = 1, // notice the sequential values now
    Option_B = 2,
    Option_C = 3,
    Option_D = 4,
}

HashSet<Option> options = new HashSet<Option> { Option.Option_A, Option.Option_C };
if(options.Contains(Option.Option_A)) // ...

使用按位AND来检查option中的位是否在activeOption中设置。 您还需要使两个参数都是相同的类型,以便操作符可以工作(无论如何,您正在检查Option位掩码中的位):

private static bool IsOption(Option activeOption, Option option)
{
    return (activeOption & option) == option;
}

除了提到的FlagsAttribute之外,在C#中还有Enum.HasFlag方法

using System;

[Flags] public enum DinnerItems {
   None = 0,
   Entree = 1,
   Appetizer = 2,
   Side = 4,
   Dessert = 8,
   Beverage = 16, 
   BarBeverage = 32
}

public class Example
{
   public static void Main()
   {
      DinnerItems myOrder = DinnerItems.Appetizer | DinnerItems.Entree |
                            DinnerItems.Beverage | DinnerItems.Dessert;
      DinnerItems flagValue = DinnerItems.Entree | DinnerItems.Beverage;
      Console.WriteLine("{0} includes {1}: {2}", 
                        myOrder, flagValue, myOrder.HasFlag(flagValue));
   }
}
// The example displays the following output:
//    Entree, Appetizer, Dessert, Beverage includes Entree, Beverage: True

如果您使用的是.NET 4.0,则可以使用HasFlag

static void Main(string[] args)
{
    Option activeOption = (Option)5; // Means I activeted the Option_A and Option_C
    if (activeOption.HasFlag(Option.Option_A)) { /*do work*/ }
    if (activeOption.HasFlag(Option.Option_B)) { /*do work*/ }
    if (activeOption.HasFlag(Option.Option_C)) { /*do work*/ }
    if (activeOption.HasFlag(Option.Option_D)) { /*do work*/ }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM