2011-08-07 21 views
5

私はいくつかの文字列を列挙型フラグに解析しましたが、単一の列挙型ビットフィールドにそれらをマージするうまい方法を見ることができません。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>と付き合っています。助言がありますか?あなたが使用することができますIEnumerable<MyEnum>から

+0

ですn 'IEnumerable 'ではなく、 'IEnumerable 'ではありません。 – BoltClock

+0

@BoltClock、このコード例は文字列配列を示していますが、 'flags.select(flag =>(MyEnum)Enum.Parse(type、(MyEnum)、flag、true))'を使って 'IEnumerable 'を返します。私は立ち往生している。 – waj

答えて

12

まあ、:

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

または空のシーケンスに対応するために:

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

それは基本的にあなたがすでに明らかに、持っているのと同じことです。 ..

全体的にコードは次のようになります。

(これはGuffaの回答ごとに1回の呼び出しで実行することができますが、わかりやすくするために2つの別々にしておきます。それは私のUnconstrained Melodyプロジェクトはややより快適なハンドリング列挙型を作る

注)。しかし個人的な好みだし、あなたも、あなたは可能性が制約のないメロディを使用して、例えば4

だから、.NETのジェネリックEnum.TryParseメソッドを使用することができます使用:

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

関連する問題