Как преобразовать List <string> в List <myEnumType>?

Мне не удалось преобразовать 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,
}

Есть ли что-то не так? Благодарим за ответы.

Ответы

Ответ 1

EDIT: Ой, я тоже пропустил тег С# 2. Я оставлю другие варианты, доступные ниже, но:

В С# 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();
    

Ответ 2

В С# 2.0:

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

Ответ 3

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

Ответ 4

Создайте метод расширения и 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())); 

Я пропустил тег С# 2.0:)

Ответ 5

Я добавил метод расширения для IEnumerable<string>, чтобы сделать это для меня. Очевидно, что ответ на skeet является хорошим, но он будет генерировать исключение, если строки недействительны для перечисления (что вам может или не нужно), и это довольно уродливая линия.

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.