如何将 List<string> 转换为 List<myEnumType>?
Posted
技术标签:
【中文标题】如何将 List<string> 转换为 List<myEnumType>?【英文标题】:How can I convert List<string> to List<myEnumType>? 【发布时间】:2010-12-13 07:14:52 【问题描述】:我未能将List<string>
转换为List<myEnumType>
。我不知道为什么?
string Val = it.Current.Value.ToString(); // works well here
List<myEnumType> ValList = new List<myEnumType>(Val.Split(',')); // compile failed
当然myEnumType
类型定义为字符串枚举类型,
public enum myEnumType
strVal_1,
strVal_2,
strVal_3,
有什么问题吗?感谢您的回复。
【问题讨论】:
@All,看起来这不是一个愚蠢的问题。再次感谢所有快速回复。我将练习任何解决方案,并将其作为我的学习案例。 【参考方案1】:编辑:糟糕,我也错过了 C# 2 标签。我将在下面保留其他可用选项,但是:
在 C# 2 中,您可能最好使用 List<T>.ConvertAll
:
List<MyEnumType> enumList = stringList.ConvertAll(delegate(string x)
return (MyEnumType) Enum.Parse(typeof(MyEnumType), x); );
或Unconstrained Melody:
List<MyEnumType> enumList = stringList.ConvertAll(delegate(string x)
return Enums.ParseName<MyEnumType>(x); );
请注意,这确实假设您确实有一个 List<string>
开头,这对于您的标题是正确的,但对于您问题中的正文则不正确。幸运的是,有一个等效的静态 Array.ConvertAll
方法,您必须像这样使用它:
MyEnumType[] enumArray = Array.ConvertAll(stringArray, delegate (string x)
return (MyEnumType) Enum.Parse(typeof(MyEnumType), x); );
原答案
两种选择:
在 LINQ 查询中使用 Enum.Parse 和强制转换:
var enumList = stringList
.Select(x => (MyEnumType) Enum.Parse(typeof(MyEnumType), x))
.ToList();
或
var enumList = stringList.Select(x => Enum.Parse(typeof(MyEnumType), x))
.Cast<MyEnumType>()
.ToList();
使用我的Unconstrained Melody 项目:
var enumList = stringList.Select(x => Enums.ParseName<MyEnumType>(x))
.ToList();
【讨论】:
@Jon Skeet,看起来我在上面发布了一个非常简单的问题。我得到了一个超出我知识范围的复杂解决方案。我会试试。谢谢你。 :-) @Jon Skeet,他可以在 C# 2.0 中使用它吗?? @Nano HE:查看允许 C# 2 代码的编辑。如果可能的话,我强烈建议您更新到更新版本的 C# :) @decyclone:我没有发现 C# 2 标签,但我已经适当地更新了答案。 @Jon Skeet: +1ConvertAll
+ 匿名代表【参考方案2】:
在 C# 2.0 中:
List<myEnumType> ValList = new List<myEnumType>();
foreach (string x in Val.Split(','))
ValList.Add((MyEnumType) Enum.Parse(typeof(MyEnumType), x));
【讨论】:
【参考方案3】: List<String> list = new List<String>();
list.Add("strVal_1");
list.Add("strVal_2");
list.Add("strVal_3");
List<myEnumType> enumList = new List<myEnumType>();
foreach (var item in list)
enumList.Add((myEnumType)Enum.Parse(typeof(myEnumType), item));
【讨论】:
【参考方案4】:创建一个扩展方法并使用Select
完成工作:
public static class ExtensionClass
public static myEnumType GetEnumValue(this string input)
if (input == myEnumType.strVal_1.ToString())
return myEnumType.strVal_1;
return input == myEnumType.strVal_2.ToString() ? myEnumType.strVal_2 : myEnumType.strVal_3;
List<myEnumType> ValList = new List<myEnumType>(Val.Split(',').Select(p=>p.GetEnumValue()));
我错过了 c#2.0 标签:)
【讨论】:
【参考方案5】:我向IEnumerable<string>
添加了一个扩展方法来为我执行此操作。显然,Skeet 的回答很好,但是如果字符串对枚举无效(您可能想要也可能不想要),它会抛出异常,而且这是一条非常难看的线。
public static class StringEnumerableExtensions
public static IEnumerable<T> StringsToEnums<T>( this IEnumerable<string> strs) where T : struct, IConvertible
Type t = typeof( T );
var ret = new List<T>();
if( t.IsEnum )
T outStr;
foreach( var str in strs )
if( Enum.TryParse( str, out outStr ) )
ret.Add( outStr );
return ret;
鉴于此枚举:
public enum ColorEnum Blue, Yellow
你可以这样使用:
var colors = new List<string>() "Blue","Yellow","Black";
var colorEnums = colors.StringsToEnums<ColorEnum>();
你会得到一个只有Blue
和Yellow
的列表。
【讨论】:
以上是关于如何将 List<string> 转换为 List<myEnumType>?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Hashmap 中的值转换为 List<String>
如何将 Mono<List<String>> 转换为 Flux<String>
如何将 C# List<string[]> 转换为 Javascript 数组?
如何将 C# 中的 Dictionary <string,List<string>> 转换为带有键作为标题的 csv?
如何将地图 List<Map<String, String>> myList 列表转换为 Java 中的 Spark Dataframe?