[英]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
查看使用Flag Attributes的Enumerations。
http://www.codeproject.com/Articles/37921/Enums-Flags-and-Csharp-Oh-my-bad-pun.aspx
如果您使用的是.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.