簡體   English   中英

如何在C#中將IEnumerable <Enum>轉換為Enum?

[英]How do I convert IEnumerable<Enum> to Enum in C#?

我已經將幾個字符串解析為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> 有什么建議?

好吧,從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項目使枚舉處理更加愉快,您還可以在.NET 4中使用通用的Enum.TryParse方法。

例如,使用Unconstrained Melody,您可以使用:

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

您可以使用Aggregate方法將標記放在一起:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM