2010-12-13 145 views
13

我未能将List<string>转换为List<myEnumType>。我不知道为什么?如何将列表<string>转换为列表<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

@All,看起来这不是一个愚蠢的问题。再次感谢所有快速回复。我会练习任何解决方案,只是把它作为我的学习案例。 – 2010-12-13 07:26:46

回答

26

编辑:哎呀,我错过了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); }); 

原来的答复

两个选项:

  • 使用Enum.Parse和LINQ查询中的演员表:

    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

@Jon Skeet,看起来我上面发布了一个非常简单的问题。我得到了一个超越我所知的复杂解决方案。我会尝试。谢谢。 :-) – 2010-12-13 07:23:36

+0

@Jon Skeet,他可以在C#2.0中使用它吗? – decyclone 2010-12-13 07:25:44

+0

@Nano HE:请参阅编辑以允许C#2代码。如果可能,我强烈建议您更新到C#的更新版本:) – 2010-12-13 07:25:59

2

在C#2.0:

List<myEnumType> ValList = new List<myEnumType>(); 
foreach (string x in Val.Split(',')) 
    ValList.Add((MyEnumType) Enum.Parse(typeof(MyEnumType), x)); 
+0

foreach Loop方法看起来不错,它工作得很好! – 2010-12-13 07:55:13

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)); 
     } 
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的标签:)

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

,你会得到一个清单,只是BlueYellow

相关问题