如何简单迭代枚举类型为整数的枚举值?

6
我有以下枚举类型:
Public Enum myEnum As Integer  
    first = &H1
    second = &H2
    third = &H4
    fourth = &H8
    fifth = &H10
    sixth = &H20
End Enum

很不幸,枚举元素需要这些值,或者至少具有可以进行二进制比较的值。
我有一个类,在构造期间可以设置为两种类型之一,一种类型的值与第一到第四相关,另一种类型的值与第一到第六相关。
我想使用For循环遍历枚举的1-4或1-6个元素,但我发现这段代码:
For enumType as myEnum = myEnum.first to myEnum.fourth
Next

循环遍历{1,2,3,4,5,6,7,8}而不是{1,2,4,8}。
这并不理想。

显然,我可以编写解决此问题的代码,但我可以想象在维护编程中可能会轻易忽略该解决方法, 我希望有人能推荐一个简单的解决方案,即使例如枚举中的值在以后更改也不会出错。

5个回答

3

对于C#的抱歉:

static IEnumerable<T> EnumRange<T>(T begin, T end)
{
    T[] values = (T[])Enum.GetValues(typeof(T));
    int beginIndex = Array.IndexOf(values, begin);
    int endIndex = Array.IndexOf(values, end);

    for(int i = beginIndex; i <= endIndex; ++i)
        yield return values[i];
}

foreach(MyEnum e in EnumRange(MyEnum.First, MyEnum.Fourth)
    // Code goes here

我选择将此标记为答案,因为我对VB仍然缺乏yield关键字感到不满。 - Frosty840

2

我希望你需要使用 Enum.GetValues() 方法,并过滤出你需要的结果。例如,使用 LINQ(使用 C#,因为我不太了解 VB):

(注意:这里重要的是 GetValues 方法 - 在 VB 和 C# 中应该是相同的)

static void Main() {
    var qry = from MyEnum value in Enum.GetValues(typeof(MyEnum))
              where value >= MyEnum.First && value <= MyEnum.Fourth
              orderby value // to sort by value; remove otherwise
              select value;

    foreach (var value in qry) {
        Console.WriteLine(value);
    }
}
enum MyEnum { 
    First = 0x01,
    Second = 0x02,
    Third = 0x04,
    Fourth = 0x08,
    Fifth = 0x10,
    Sixth = 0x20
}

2

马克基本上是正确的,只是您不需要显式排序(Enum.GetValues已经返回排序),并且您需要进行输出转换:

enum myEnum
{
    first = 0x1,
    second = 0x2,
    third = 0x4,
    fourth = 0x8,
    fifth = 0x10,
    sixth = 0x20,
}

public static void Main(string[] a)
{
    var qry = from myEnum value in Enum.GetValues(typeof(myEnum))
        where value >= myEnum.first && value <= myEnum.fourth
        select value;
    foreach(var value in qry)
    {
        Console.WriteLine((int)value);
    }
}

2
我知道这个问题已经有答案了,但我觉得这个问题被过度思考了。为什么不这样做呢?
    Private Shared Sub Main()

        Dim aryEnums As Array = [Enum].GetValues(GetType(myEnum))

        For i As Integer = 0 To aryEnums.GetLength(0) - 1

            Console.WriteLine(aryEnums(i))

        Next

    End Sub

1
Frosty840想要迭代枚举值的特定范围。 - Stephan

1

看一下 Enum.GetValues(Type)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接