Простая итерация через перечисление типа Integer? - PullRequest
5 голосов
/ 30 апреля 2009

У меня есть следующий Enum:

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 голосов
/ 30 апреля 2009

Извините за 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
2 голосов
/ 30 апреля 2009

Марк в основном прав, за исключением того, что вам не нужно явно сортировать (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);
    }
}
1 голос
/ 12 ноября 2009

Я знаю, что на это уже ответили, но мне кажется, что это было продумано. Почему бы не сделать это?

    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 голос
/ 30 апреля 2009

Полагаю, вам нужно будет использовать 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
}
1 голос
/ 30 апреля 2009

Посмотрите на Enum.GetValues(Type)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...