2011-08-07 13 views
5

Enum bayraklarına birkaç dizeyi ayrıştırdım, ancak bunları tek bir Enum bit alanıyla birleştirmenin düzgün bir yolunu göremiyorum.IEnumerable <Enum>'u En # C ile Enum'a nasıl dönüştürebilirim?

Sonra dize değerlerini aracılığıyla döngüler kullanıyorum yöntem | = dökme Enum nesnesine değerleri şöyle:

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

Ben Seç yöntemi kullanarak denedim benim Enum tipine dönüştürmek için ama sonra IEnumerable<MyEnum> ile sıkışıp kaldım. Baska öneri?

+0

bir That n 'IEnumerable ', bir 'IEnumerable '. – BoltClock

+0

@BoltClock, kod örneği bir dizi dizisini gösterir, ancak 'flags.select (flag => (MyEnum) Enum.Parse (typeof (MyEnum), flag, true))' 'IEnumerable ' döndürür ve burada Sıkıştım. – waj

cevap

12

Eh, bir IEnumerable<MyEnum> dan kullanabilirsiniz: kuşkusuz, zaten var olduğu

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

Temelde aynı şey:

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

veya boş bir diziyi karşılamak amacıyla

. .. Yani genel

, kod şöyle olacaktır:

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

(Bunu, tek bir Aggregate numaralı telefon görüşmesinde, Guffa'nın yanıtına göre yapabilirsiniz, ancak kişisel olarak, açıklık sağlamak için ikisini ayrı tutabileceğimi düşünüyorum. Benim Unconstrained Melody proje biraz daha hoş taşıma enum yapar

Not). Gerçi bir kişisel tercih ve sen de yaparsın Kısıtsız Melodi kullanarak, örneğin 4.

Yani .NET jenerik Enum.TryParse yöntemi kullanabilirsiniz Kullanım:

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

Ahha C# daha iyi, jenerik bir çözüm olduğunu biliyordum! Çok teşekkürler. – waj

3

birlikte bayrakları koymak için Aggregate yöntemi kullanabilirsiniz:

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

Özlü ve zarif, teşekkürler. – waj

İlgili konular