2009-04-24 24 views
5

Tôi có cơ cấu enum như sau:Nhận một Danh sách sẵn Enums

public enum MyEnum 
{ 
    One=1, 
    Two=2, 
    Three=3 
} 

Bây giờ tôi muốn có được một danh sách các MyEnum, ví dụ: List<MyEnum> có chứa tất cả các One, TwoThree. Again, Tôi đang tìm một lớp lót làm điều đó. Tôi đã đưa ra một truy vấn LINQ nhưng nó không đạt yêu cầu vì nó quá dài, tôi nghĩ:

Enum.GetNames(typeof(MyEnum)) 
          .Select(exEnum => 
           (MyEnum)Enum.Parse(typeof(MyEnum), exEnum)) 
          .ToList(); 

Một gợi ý tốt hơn?

Trả lời

14
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>(); 
+3

Tất nhiên, ToList() nó nếu bạn thực sự cần phải thực hiện một danh sách nói riêng. – mquander

2

Không một ai cả lót (cũng thực hiện không phải là, nhưng phương pháp này là: P), nhưng có lẽ thêm một cái gì đó giống như this đến một lớp học cụ/tiện ích mà sẽ trả về một danh sách chung:

public static List<T> EnumToList<T>() 

{ 

Type enumType = typeof(T); 

// Can't use type constraints on value types, so have to do check like this 

if (enumType.BaseType != typeof(Enum)) 

    throw new ArgumentException("T must be of type System.Enum"); 

return new List<T>(Enum.GetValues(enumType) as IEnumerable<T>); 

} 
+0

Tôi sẽ thích giải pháp của riêng tôi hơn cho bạn. – Graviton

+0

Nó sẽ không được tốt đẹp nếu C# đã có một "nơi T: enum" hạn chế chung? –

+0

Đó là tốt, nhưng bạn có thực sự cần phải downvote đề nghị của tôi? heh –

3

Tôi đồng ý với mã @ mquander.

Tuy nhiên, tôi khuyên bạn cũng nên bộ nhớ cache danh sách, vì nó rất khó thay đổi trong quá trình thực thi chương trình của bạn. Đặt nó vào biến chỉ đọc tĩnh ở một số địa điểm toàn cầu:

public static class MyGlobals 
{ 
    public static readonly List<MyEnum> EnumList = 
     Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToList(); 
} 
Các vấn đề liên quan