2011-08-07 90 views
5

我已經將幾個字符串解析成Enum標誌,但看不到將它們合併成單個Enum位域的整潔方式。如何將IEnumerable <Enum>轉換爲C#中的Enum?

我使用遍歷字符串值,則該方法| =鑄造值枚舉對象,像這樣:

[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); 

我用Select方法試圖轉換到我的枚舉類型,但後來我堅持與IEnumerable<MyEnum>。有什麼建議麼?

+0

這是一個n'IEnumerable ',而不是'IEnumerable '。 – BoltClock

+0

@BoltClock,代碼示例顯示了一個字符串數組,但是使用'flags.select(flag =>(MyEnum)Enum.Parse(typeof(MyEnum),flag,true))''返回一個'IEnumerable ',那就是我卡住了。 – waj

回答

12

那麼,從IEnumerable<MyEnum>你可以使用:

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

或者爲了容納一個空序列:

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

它基本上是同樣的事情,你已經有了,無可否認。 ...

總的來說,代碼應該是:

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

(根據Guffa的回答,您可以在單個Aggregate調用中執行此操作,但爲了清晰起見,我個人認爲我會保持兩個不同。這是一個個人喜好雖然)。

注意,我Unconstrained Melody項目使枚舉處理稍微更愉快,你也可以使用通用Enum.TryParse方法在.NET 4

因此,例如,使用無約束的旋律你能用途:

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

Ahha我知道C#有一個更好的通用解決方案!非常感謝。 – waj

3

可以使用Aggregate方法把國旗一起:

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

簡潔優雅,謝謝。 – waj

相關問題