2010-12-13 182 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

相關問題