Как преобразовать 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();
Ответ 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
.