gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:09:50 24 4
gpt4 key购买 nike

我喜欢编写枚举或整数来将选项传递给我的方法。 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's answer 中链接的文章.如果您正在运行 .NET 4,您甚至不需要这样做:检查 sehe's answer .

但你真的应该尝试使用 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)) // ...

关于c# - C# 中是否有一种模式或方法来检查 (int 1,2,4,8,...) 选项是真还是假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6069869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com