2009-04-30 34 views
5

Tôi có Enum sau:Lặp lại đơn giản thông qua một enum kiểu Integum?

Public Enum myEnum As Integer 
    first = &H1 
    second = &H2 
    third = &H4 
    fourth = &H8 
    fifth = &H10 
    sixth = &H20 
End Enum 

Nó là cần thiết, không may, rằng các yếu tố enum có những giá trị, hoặc ít nhất là có giá trị có thể được nhị phân so sánh.

Tôi có một lớp có thể được đặt trong khi xây dựng thành một trong hai loại, một loại có giá trị liên quan từ thứ nhất đến thứ tư và loại thứ hai với các giá trị liên quan đến từ đầu đến thứ sáu.

Tôi muốn sử dụng một Đối với vòng lặp để lặp qua 1-4 hoặc 1-6 yếu tố của enum, nhưng tôi đã phát hiện ra rằng đoạn mã này:

For enumType as myEnum = myEnum.first to myEnum.fourth 
Next 

lặp thông qua {1,2,3 , 4,5,6,7,8} và không thông qua {1,2,4,8}.
Điều này không lý tưởng. Rõ ràng là tôi có thể viết mã xung quanh vấn đề này, nhưng tôi có thể thấy một kịch bản có thể dễ dàng bị mất trong lập trình bảo trì và tôi hy vọng ai đó có thể đề xuất một giải pháp đơn giản sẽ không phá vỡ nếu các giá trị trong enum phải thay đổi vào một ngày sau đó.

Trả lời

3

Xin lỗi vì 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 
+0

Đánh dấu câu trả lời này là câu trả lời cho những người khác vì tôi cay đắng về VB * vẫn * thiếu từ khóa lợi nhuận. – Frosty840

1

Nhìn vào Enum.GetValues(Type)

1

Tôi hy vọng bạn sẽ cần phải sử dụng Enum.GetValues(), và lọc các kết quả với những gì bạn muốn. Ví dụ, sử dụng LINQ) (và sử dụng C#, như tôi không biết VB cũng đủ):

(lưu ý: điều quan trọng ở đây là GetValues - mà phải là giống hệt nhau giữa VB và 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

Marc về cơ bản là đúng, ngoại trừ việc bạn không cần phải dứt khoát loại (Enum.GetValues ​​đã trả được sắp xếp), và bạn cần phải cast cho đầu ra:

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

tôi biết rằng điều này đã được trả lời , nhưng có vẻ như với tôi rằng điều này đã bị suy nghĩ. Tại sao không làm điều này?

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 
+0

Điều này cực kỳ hữu ích đối với tôi. Chính xác những gì tôi đang tìm kiếm. Cảm ơn! – Urbycoz

+1

Frosty840 muốn lặp qua một phạm vi cụ thể của các giá trị enum. – Stephan

Các vấn đề liên quan