2010-12-13 13 views
13

Nie udało się przekonwertować List<string> na List<myEnumType>. Nie wiem dlaczego?Jak przekonwertować listę <string> na listę <myEnumType>?

string Val = it.Current.Value.ToString(); // works well here 
List<myEnumType> ValList = new List<myEnumType>(Val.Split(',')); // compile failed 

przyczyny myEnumType typ zdefiniowany jako ciąg typu enum jako ten,

public enum myEnumType 
{ 
    strVal_1, 
    strVal_2, 
    strVal_3, 
} 

Czy jest coś złego? Doceniam odpowiedzi.

+0

@All, Wygląda na to, że to nie jest głupie pytanie. Dziękuję za wszystkie szybkie odpowiedzi ponownie. Będę ćwiczyć którekolwiek z rozwiązań, po prostu potraktuj to jako mój przypadek nauki. –

Odpowiedz

26

EDYCJA: Ups, również pominięto tag C# 2. Zostawię inne opcje dostępne poniżej, ale:

W języku C# 2, jesteś prawdopodobnie najlepiej używając List<T>.ConvertAll:

List<MyEnumType> enumList = stringList.ConvertAll(delegate(string x) { 
    return (MyEnumType) Enum.Parse(typeof(MyEnumType), x); }); 

lub z Unconstrained Melody:

List<MyEnumType> enumList = stringList.ConvertAll(delegate(string x) { 
    return Enums.ParseName<MyEnumType>(x); }); 

Zauważ, że to robi załóżmy, że na początku masz List<string>, który jest poprawny dla twojego tytułu, ale nie dla ciała w twoim pytaniu. Na szczęście istnieje odpowiednik statyczne Array.ConvertAll metoda, która trzeba by użyć takiego:

MyEnumType[] enumArray = Array.ConvertAll(stringArray, delegate (string x) { 
    return (MyEnumType) Enum.Parse(typeof(MyEnumType), x); }); 

Original odpowiedź

dwie opcje:

  • Zastosowanie Enum.Parse i rzutowanie w zapytaniu LINQ:

    var enumList = stringList 
          .Select(x => (MyEnumType) Enum.Parse(typeof(MyEnumType), x)) 
          .ToList(); 
    

lub

var enumList = stringList.Select(x => Enum.Parse(typeof(MyEnumType), x)) 
          .Cast<MyEnumType>() 
          .ToList(); 
  • Użyj mojego Unconstrained Melody projekt:

    var enumList = stringList.Select(x => Enums.ParseName<MyEnumType>(x)) 
             .ToList(); 
    
+1

@Jon Skeet, Wygląda na to, że napisałem bardzo proste pytanie powyżej. I mam kompleksowe rozwiązanie poza moją wiedzą. Spróbuję. Dziękuję Ci. :-) –

+0

@Jon Skeet, czy może użyć tego w C# 2.0 ?? – decyclone

+0

@Nano HE: Zobacz edycję, aby zezwolić na kod C# 2. Radziłbym zaktualizować do nowszej wersji C# jeśli to możliwe :) –

2

w 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 Metoda Loop wygląda świetnie, działa całkiem nieźle! –

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

Utwórz metodę rozszerzenia iz Select wykonać pracę:

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

Tęskniłem C# 2.0 tag :)

1

dodałem metodę rozszerzenia do IEnumerable<string> to zrobić dla mnie. Odpowiedź Skeeta jest dobra, oczywiście, ale rzuci wyjątek, jeśli struny nie są ważne dla enum (które możesz lub nie chcesz) i jest to dość paskudnie wyglądająca linia.

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; 
    } 
} 

Biorąc pod uwagę ten ENUM:

public enum ColorEnum { Blue, Yellow } 

można użyć tego tak:

var colors = new List<string>() {"Blue","Yellow","Black"}; 
var colorEnums = colors.StringsToEnums<ColorEnum>(); 

a otrzymasz listę z tylko Blue i Yellow.

Powiązane problemy