我无法将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,
}
有什么不对吗?感谢您的回复。
答案 0 :(得分:31)
在C#2中,您最好使用List<T>.ConvertAll
:
List<MyEnumType> enumList = stringList.ConvertAll(delegate(string x) {
return (MyEnumType) Enum.Parse(typeof(MyEnumType), x); });
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();
答案 1 :(得分:2)
在C#2.0中:
List<myEnumType> ValList = new List<myEnumType>();
foreach (string x in Val.Split(','))
ValList.Add((MyEnumType) Enum.Parse(typeof(MyEnumType), x));
答案 2 :(得分:1)
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));
}
答案 3 :(得分:1)
创建一个扩展方法,并使用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标签:)
答案 4 :(得分:1)
我为IEnumerable<string>
添加了一个扩展方法来为我执行此操作。显然,Skeet的答案是好的,但是如果字符串对于enum(你可能想要或可能不想要)无效,它会抛出异常,并且它看起来很难看。
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
的列表。