【问题标题】:Is this GetEnumAsStrings<T>() method reinventing the wheel?这个 GetEnumAsStrings<T>() 方法是在重新发明轮子吗?
【发布时间】:2011-03-02 04:59:59
【问题描述】:

我有许多 枚举,需要将它们作为 List&lt;string&gt; 对象,以便通过它们枚举,从而使GetEnumAsStrings&lt;T&gt;() 方法。

但在我看来会有更简单的方法。

没有内置方法可以将这样的枚举放入List&lt;string&gt;吗?

using System;
using System.Collections.Generic;

namespace TestEnumForeach2312
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> testModes = StringHelpers.GetEnumAsStrings<TestModes>();
            testModes.ForEach(s => Console.WriteLine(s));

            Console.ReadLine();
        }
    }

    public static class StringHelpers
    {
        public static List<string> GetEnumAsStrings<T>()
        {
            List<string> enumNames = new List<string>();
            foreach (T item in Enum.GetValues(typeof(TestModes)))
            {
                enumNames.Add(item.ToString());
            }
            return enumNames;
        }
    }

    public enum TestModes
    {
        Test,
        Show,
        Wait,
        Stop
    }
}

附录:

谢谢大家,很有见地。因为我最终需要这个 Silverlight 似乎没有 GetValues()GetNames() 用于枚举,所以我创建了这个从 this method 创建的方法:

public static List<string> ConvertEnumToListOfStrings<T>()
{
    Type enumType = typeof(T);
    List<string> strings = new List<string>();
    var fields = from field in enumType.GetFields()
                 where field.IsLiteral
                 select field;
    foreach (FieldInfo field in fields)
    {
        object value = field.GetValue(enumType);
        strings.Add(((T)value).ToString());
    }
    return strings;
}

【问题讨论】:

    标签: c# list foreach ienumerable enums


    【解决方案1】:

    您可以使用 LINQ 以单行方式完成:

    var enums = Enum.GetNames(typeof(TestModes)).ToList();
    

    现在,请记住 GetNames 返回一个字符串数组...所以您甚至可能不需要 ToList()

    编辑:
    有一些方法可以改进您编辑的代码。这是一个使用ToList 而不是显式实例化列表的简单示例:

    public static List<string> ConvertEnumToListOfStrings<T>()
    {
        Type enumType = typeof(T);
        var fields = from field in enumType.GetFields()
                     where field.IsLiteral
                     select ((T)field.GetValue(enumType)).ToString();
        return fields.ToList();    
    }
    

    下一个是我个人的喜好。为什么要实例化一个列表?您可能只需要遍历名称,而不是在列表中添加或删除它们。所以只需使用IEnumerable 并且根本不用费心构建列表。为您节省一个(公认很小的)迭代和另一个对象的内存开销。

    public static IEnumerable<string> GetEnumNames<T>()
    {
        Type enumType = typeof(T);
        var fields = from field in enumType.GetFields()
                     where field.IsLiteral
                     select ((T)field.GetValue(enumType)).ToString();
        return fields;
    }
    

    【讨论】:

      【解决方案2】:

      MSDN - Enum.GetNames

      因此,对于您的示例,它将是:

      List<string> testModes = Enum.GetNames(typeof(TestModes)).ToList();
      

      或者,如果您仍然使用 .NET 2.0

      List<string> testModes = new List<string>(Enum.GetNames(typeof(TestModes)));
      

      如果你真的需要它作为List&lt;string&gt;,否则我会直接使用数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        相关资源
        最近更新 更多