Как мне конвертировать IEnumerable <Enum>в Enum в C #? - PullRequest
5 голосов
/ 07 августа 2011

Я разобрал несколько строк в флаги Enum, но не вижу четкого способа объединения их в одно битовое поле Enum.

Метод, который я использую, перебирает строковые значения, затем | = приведенные значения к объекту 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 для преобразования в мой тип Enum, но затем я застрял с IEnumerable<MyEnum>. Есть предложения?

Ответы [ 2 ]

12 голосов
/ 07 августа 2011

Ну, из 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);

(Вы можете выполнить это в один вызов Aggregate согласно ответу Гуффы, но лично ядумаю, я бы оставил их отдельно для ясности. Это личное предпочтение.)

Обратите внимание, что мой проект Unconstrained Melody делает обработку enum несколько более приятной, и вы также можете использоватьуниверсальный Enum.TryParse метод в .NET 4.

Так, например, используя неограниченную мелодию, вы можете использовать:

MyEnum result = flags.Select(x => Enums.ParseName<MyEnum>(x))
                     .Aggregate(MyEnum.None, (current, next) => current | next);
3 голосов
/ 07 августа 2011

Вы можете использовать метод Aggregate для объединения флагов:

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