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

Posted

技术标签:

【中文标题】如何将 List<string> 转换为 List<myEnumType>?【英文标题】:How can I convert List<string> to List<myEnumType>? 【发布时间】:2010-12-13 07:14:52 【问题描述】:

我未能将List&lt;string&gt; 转换为List&lt;myEnumType&gt;。我不知道为什么?

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,

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

【问题讨论】:

@All,看起来这不是一个愚蠢的问题。再次感谢所有快速回复。我将练习任何解决方案,并将其作为我的学习案例。 【参考方案1】:

编辑:糟糕,我也错过了 C# 2 标签。我将在下面保留其他可用选项,但是:

在 C# 2 中,您可能最好使用 List&lt;T&gt;.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&lt;string&gt; 开头,这对于您的标题是正确的,但对于您问题中的正文则不正确。幸运的是,有一个等效的静态 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();

【讨论】:

@Jon Skeet,看起来我在上面发布了一个非常简单的问题。我得到了一个超出我知识范围的复杂解决方案。我会试试。谢谢你。 :-) @Jon Skeet,他可以在 C# 2.0 中使用它吗?? @Nano HE:查看允许 C# 2 代码的编辑。如果可能的话,我强烈建议您更新到更新版本的 C# :) @decyclone:我没有发现 C# 2 标签,但我已经适当地更新了答案。 @Jon Skeet: +1 ConvertAll + 匿名代表【参考方案2】:

在 C# 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())); 

我错过了 c#2.0 标签:)

【讨论】:

【参考方案5】:

我向IEnumerable&lt;string&gt; 添加了一个扩展方法来为我执行此操作。显然,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>();

你会得到一个只有BlueYellow的列表。

【讨论】:

以上是关于如何将 List<string> 转换为 List<myEnumType>?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 List<int> 转换为 string[]?

如何将 Hashmap 中的值转换为 List<String>

如何将 Mono<List<String>> 转换为 Flux<String>

如何将 C# List<string[]> 转换为 Javascript 数组?

如何将 C# 中的 Dictionary <string,List<string>> 转换为带有键作为标题的 csv?

如何将地图 List<Map<String, String>> myList 列表转换为 Java 中的 Spark Dataframe?