如何将List<string>转换为List<myEnumType>?

17

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

有什么问题吗?感谢您的回复。


@所有人,看起来这不是一个愚蠢的问题。再次感谢所有快速回复。我会练习任何一种解决方案,把它作为我的学习案例。 - Nano HE
5个回答

38

编辑:糟糕,我也错过了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();
var enumList = stringList.Select(x => Enums.ParseName<MyEnumType>(x))
                         .ToList();

2
@Jon Skeet,看起来我上面发了一个非常简单的问题。但是我得到了一个超出我的知识范围的复杂解决方案。我会尝试一下。谢谢。 :-) - Nano HE
@Jon Skeet,他能在C# 2.0中使用这个吗? - decyclone
@Nano HE:请注意编辑以允许C# 2代码。如果可能的话,我强烈建议您升级到更高版本的C# :) - Jon Skeet
@Jon Skeet:对于ConvertAll和匿名委托,点赞+1。 - decyclone
@MikeatKBS:是的,绝对没错——但这个问题被标记为c#-2.0,因此我只限制在那个范围内。 - Jon Skeet
显示剩余3条评论

2
我为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>();

你会得到一个列表,只有蓝色黄色


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
        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标签 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接