2011-08-07 33 views
5

Tôi đã phân tích cú pháp một số chuỗi thành các cờ Enum nhưng không thể nhìn thấy một cách gọn gàng để hợp nhất chúng vào một bitum Enum đơn lẻ.Làm cách nào để chuyển đổi IEnumerable <Enum> thành Enum trong C#?

Phương pháp Tôi đang sử dụng vòng lặp thông qua các giá trị chuỗi sau đó | = các giá trị đúc đến đối tượng Enum, như vậy:

[Flags] 
public enum MyEnum { None = 0, First = 1, Second = 2, Third = 4 } 
... 

string[] flags = { "First", "Third" }; 
MyEnum e = MyEnum.None; 

foreach (string flag in flags) 
    e |= (MyEnum)Enum.Parse(typeof(MyEnum), flag, true); 

Tôi đã thử sử dụng một phương thức Select để chuyển đổi sang kiểu Enum của tôi , nhưng sau đó tôi bị kẹt với IEnumerable<MyEnum>. Bất kỳ đề xuất?

+0

Đó là một n 'IEnumerable ', không phải là một 'IEnumerable '. – BoltClock

+0

@BoltClock, ví dụ mã cho thấy một mảng chuỗi, nhưng sử dụng 'flags.select (flag => (MyEnum) Enum.Parse (typeof (MyEnum), cờ, true))' trả về một 'IEnumerable ' và đó là nơi Tôi bị kẹt. – waj

Trả lời

12

Vâng, từ một IEnumerable<MyEnum> bạn có thể sử dụng:

MyEnum result = parsed.Aggregate((current, next) => current | next); 

hoặc để thích ứng một chuỗi rỗng:

MyEnum result = parsed.Aggregate(MyEnum.None, (current, next) => current | next); 

Đó là cơ bản được điều tương tự như bạn đã có, thừa nhận. ..

Vì vậy, tổng thể, mã sẽ là:

MyEnum result = flags.Select(x => (MyEnum) Enum.Parse(typeof(MyEnum), x)) 
        .Aggregate(MyEnum.None, (current, next) => current | next); 

(Bạn có thể thực hiện nó trong một cuộc gọi Aggregate duy nhất theo câu trả lời của Guffa, nhưng cá nhân tôi nghĩ rằng tôi muốn giữ hai riêng biệt, để rõ ràng. Đó là một sở thích cá nhân mặc dù.)

Lưu ý rằng dự án Unconstrained Melody của tôi làm cho enum xử lý hơi dễ chịu hơn, và bạn cũng có thể sử dụng chung Enum.TryParse phương pháp trong .NET 4.

Vì vậy, ví dụ, sử dụng Unconstrained Melody bạn có thể sử dụng:

MyEnum result = flags.Select(x => Enums.ParseName<MyEnum>(x)) 
        .Aggregate(MyEnum.None, (current, next) => current | next); 
+0

Ahha Tôi biết C# đã có một giải pháp tốt hơn, chung chung! Cảm ơn nhiều. – waj

3

Bạn có thể sử dụng phương pháp Aggregate để đặt cờ với nhau:

MyEnum e = flags 
    .Select(s => (MyEnum)Enum.Parse(typeof(MyEnum), s, true)) 
    .Aggregate(MyEnum.None, (f, n) => f | n); 
+0

Ngắn gọn và thanh lịch, cảm ơn. – waj

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