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

@Все, похоже, это не глупый вопрос. Спасибо за все быстрые ответы снова. Я буду практиковать любое из этих решений, просто использую его как учебный пример. –

ответ

26

EDIT: Ой, я тоже пропустил тег 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, Похоже, я опубликовал очень простой вопрос выше. И я получаю сложное решение, которое мне известно. Я попробую. Спасибо. :-) –

+0

@Jon Skeet, может ли он использовать это в C# 2.0 ?? – decyclone

+0

@Nano HE: см. Изменение, чтобы разрешить код C# 2. Я бы настоятельно рекомендовал вам обновить до более поздней версии C#, если это возможно :) –

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 метод отлично выглядит, он работает очень хорошо! –

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>, чтобы сделать это для меня. Конечно, ответ Скита хорош, но он будет генерировать исключение, если строки недействительны для перечисления (которые вы можете или не хотите), и это довольно уродливая линия.

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.

Смежные вопросы