【问题标题】:How to iterate through "set" enum in .NET C# 3.5如何在 .NET C# 3.5 中遍历“set”枚举
【发布时间】:2013-01-21 15:41:36
【问题描述】:

我知道在 .NET 4 中你可以使用 HasFlag

.NET 3.5 中是否有以下替代方案?

if ((enumVar & EnumType.ValueOne) == EnumType.ValueOne)
{
  // someMethod(1) or someMethod(EnumType.ValueOne)
}
if ((enumVar & EnumType.ValueTwo) == EnumType.ValueTwo)
{
  // someMethod(2) or someMethod(EnumType.ValueTwo)
}
if ((enumVar & EnumType.ValueThree) == EnumType.ValueThree)
{
  // someMethod(3) or someMethod(EnumType.ValueThree)
}
if ((enumVar & EnumType.ValueFour) == EnumType.ValueFour)
{
  // someMethod(4) or someMethod(EnumType.ValueFour)
}

...等枚举中的每个值?您必须能够使用 for..each 循环来完成此操作,其中 someMethod 的参数是循环的索引?

[Flags]
enum EnumType
{
  ValueOne = 1
  , ValueTwo = 2
  , ValueThree = 4
  , ValueFour = 8
}

编辑:只看接受的答案,其余的 cmets/answers 可以安全地忽略。

【问题讨论】:

  • 为什么不直接使用 switch/case 语句?
  • 所以你承认它不能循环完成吗?
  • 你没有使用循环你正在使用 if ......
  • @RhysW 这就是重点。我给出了 if 并询问是否可以将它们重写为循环
  • 抱歉,我以为你的回复是针对 Chris,没有看到循环要求

标签: c# .net .net-3.5 enums bit-manipulation


【解决方案1】:

你应该能够写出这样的东西。您可以根据需要将其设为通用,但无法将约束设置为枚举,因此您必须自己通过反射检查。

public static bool HasFlag(YourEnum source, YourEnum flag)
{
    return (source & flag) == flag;
}

【讨论】:

  • 对此感到羞耻,我猜这就是为什么引入 hasFlag
  • @GregT 如果你“作弊”,你可以限制为一个枚举。请参阅 another answer in another thread 链接项目 Unconstrained Melody。
【解决方案2】:
foreach (EnumType enumType in Enum.GetValues(typeof(EnumType)))
{
    if(enumVar.HasFlag(enumType)) 
    {
        Console.WriteLine(enumTpye.ToString());
    }
}

【讨论】:

  • 我确实说过不要使用 HasFlag - 这是 .NET 3.5
  • 道歉 - 没有读到。在这种情况下,您需要使用 & 运算符。
  • @lazyberezovsky HasFlag 是在 .net 4 中引入的,他使用的是早期版本
  • if(enumVar & enumType){...} 应该产生与 hasFlag 相同的结果
  • 可以,但是 HasFlag 可以参数化,但其他符号不能,所以不能在循环中完成
【解决方案3】:
switch enumvar
{
case valueOne:
{
//do some thing
breake;
}
case valuetwo:
{
//do some thing else
break;
}
default:
break;
    }

【讨论】:

    【解决方案4】:

    你可以这样做来做一个 EnumType 的 foreach 循环

    foreach (EnumType enumType in Enum.GetValues(typeof(EnumType)))
    {
        if (enumType.HasFlag(enumType))
        {
            Console.WriteLine(enumType.ToString());
        }
    }
    

    这将返回 ValueOne、ValueTwo、ValueThree.. 蚀刻 不确定这是否是您正在寻找的东西,请测试并让我和其他人知道

    【讨论】:

    • 那不检查是否设置了枚举值?
    • 您可以在该循环中添加条件语句希望我正确理解您的问题.. 如果您愿意,还可以添加 Switch 语句
    • 你能给出示例代码吗?它不能使用 HasFlag,因为这是 .NET 3.5
    • GregT 我误解了你的问题我给出了一个答案,它将在 forloop 中返回 EnumType 的值我道歉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2023-03-03
    • 2016-06-08
    • 1970-01-01
    • 2010-10-03
    • 2010-12-12
    • 2011-09-01
    相关资源
    最近更新 更多