2010-12-13 14 views
13

No pude convertir List<string> en List<myEnumType>. No sé por qué?¿Cómo puedo convertir la lista <string> en la lista <myEnumType>?

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

De la causa myEnumType tipo definido como tipo de cadena de enumeración de este tipo,

public enum myEnumType 
{ 
    strVal_1, 
    strVal_2, 
    strVal_3, 
} 

¿hay algo malo? Apreciado por sus respuestas.

+0

@All, parece que no es una pregunta estúpida. Gracias por todas las respuestas rápidas de nuevo. Practicaré cualquiera de las soluciones simplemente vuélvala como mi caso de aprendizaje. –

Respuesta

26

EDITAR: Oops, también eché de menos la etiqueta C# 2. Voy a dejar las otras opciones disponibles a continuación, pero:

En C# 2, usted es probablemente mejor usar List<T>.ConvertAll:

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

o con Unconstrained Melody:

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

en cuenta que esto Supongamos que realmente tiene un List<string> para empezar, que es correcto para su título pero no para el cuerpo en su pregunta. Afortunadamente hay un equivalente Array.ConvertAll método estático que tendría que utilizar la siguiente manera:

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

Respuesta original

Dos opciones:

  • Uso y Enum.Parse un molde en una consulta LINQ:

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

o

var enumList = stringList.Select(x => Enum.Parse(typeof(MyEnumType), x)) 
          .Cast<MyEnumType>() 
          .ToList(); 
  • utiliza mi Unconstrained Melody proyecto:

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

@Jon Skeet, Parece que he publicado una pregunta muy simple arriba. Y obtengo una solución compleja más allá de mi conocimiento. Voy a intentarlo. Gracias. :-) –

+0

@Jon Skeet, ¿puede usar esto en C# 2.0? – decyclone

+0

@Nano HE: vea la edición para permitir el código C# 2. Le recomendaría encarecidamente que actualice a una versión más reciente de C# si es posible :) –

2

En 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 El método Loop se ve muy bien, ¡funciona bastante bien! –

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

Crear un método de extensión y con Select hacer el trabajo:

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

me perdí C# 2.0 etiqueta :)

1

añadí un método de extensión a IEnumerable<string> a hacer esto por mí. La respuesta de Skeet es buena, obviamente, pero arrojará una excepción si las cadenas no son válidas para la enumeración (que puede o no desear), y es una línea bastante fea.

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

Dada esta enumeración:

public enum ColorEnum { Blue, Yellow } 

Se puede usar esta así:

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

y obtendrá una lista con sólo Blue y Yellow.

Cuestiones relacionadas