Edw*_*uay 3 c# ienumerable foreach enums list
我有许多枚举,需要将它们作为List<string>对象,以便通过它们进行枚举,从而制作出GetEnumAsStrings<T>()方法.
但在我看来会有一种更简单的方法.
是不是有一种内置的方法可以将这样的枚举变成一个List<string>?
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
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢大家,非常有见地.因为我最终需要Silverlight这个似乎没有GetValues()或GetNames()用于枚举,所以我使用这个方法创建了这个方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用LINQ将其作为单行使用:
var enums = Enum.GetNames(typeof(TestModes)).ToList();
Run Code Online (Sandbox Code Playgroud)
现在,请记住,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();
}
Run Code Online (Sandbox Code Playgroud)
而下一个是我个人的偏好.为什么要实例化一个列表呢?您可能只需要遍历名称,而不是从列表中添加或删除它们.所以只需使用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;
}
Run Code Online (Sandbox Code Playgroud)
所以对于你的例子,它将是:
List<string> testModes = Enum.GetNames(typeof(TestModes)).ToList();
Run Code Online (Sandbox Code Playgroud)
或者,如果你还在.NET 2.0中
List<string> testModes = new List<string>(Enum.GetNames(typeof(TestModes)));
Run Code Online (Sandbox Code Playgroud)
如果你真的需要它作为一个List<string>,否则我会直接使用数组.