[英]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.