如何将List <string>转换为List <myenumtype>?</myenumtype> </string>

时间:2010-12-13 07:14:53

标签: c# c#-2.0

我无法将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,
}

有什么不对吗?感谢您的回复。

5 个答案:

答案 0 :(得分:31)

编辑:哎呀,我也错过了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); });

原始回答

两个选项:

  • 在LINQ查询中使用Enum.Parse和强制转换:

    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 :(得分:2)

在C#2.0中:

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

答案 2 :(得分: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));
        }

答案 3 :(得分: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标签:)

答案 4 :(得分:1)

我为IEnumerable<string>添加了一个扩展方法来为我执行此操作。显然,Skeet的答案是好的,但是如果字符串对于enum(你可能想要或可能不想要)无效,它会抛出异常,并且它看起来很难看。

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

您将获得仅包含BlueYellow的列表。