簡體   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