如何将枚举转换为C#中的列表?
有没有办法将enum
转换为包含所有枚举选项的列表?
这将返回Enum的所有值的IEnumerable<SomeEnum>
。
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
如果你希望这是一个List<SomeEnum>
,只需在.Cast<SomeEnum>()
之后添加.ToList()
.Cast<SomeEnum>()
。
要在Array上使用Cast函数,您需要在使用部分中包含System.Linq
。
更简单的方法:
Enum.GetValues(typeof(SomeEnum)) .Cast<SomeEnum>() .Select(v => v.ToString()) .ToList();
简短的答案是,使用:
(SomeEnum[])Enum.GetValues(typeof(SomeEnum))
如果你需要一个局部variables,它是var allSomeEnumValues = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));
。
为什么这样的语法?
static
方法GetValues
是在旧的.NET 1.0版本中引入的。 它返回一个运行时typesSomeEnum[]
的一维数组。 但是由于它是一个非generics的方法(generics直到.NET 2.0才被引入),所以它不能像这样声明它的返回types(编译时返回types)。
.NET数组确实有一种协变性,但是因为SomeEnum
将是一个值types ,并且由于数组types协方差不适用于值types,所以甚至不能将返回types声明为object[]
或Enum[]
。 (这不同于例如.NET 1.0中的GetCustomAttributes
重载,它具有编译时返回typesobject[]
但实际上返回SomeAttribute[]
types的数组,其中SomeAttribute
必须是引用types。
因此,.NET 1.0方法必须将其返回types声明为System.Array
。 但是我保证你是SomeEnum[]
。
每次使用相同的枚举types再次调用GetValues
时,它将不得不分配一个新数组并将这些值复制到新数组中。 这是因为数组可能会被方法的“消费者”写入(修改),所以他们必须创build一个新的数组以确保值不变。 .NET 1.0没有好的只读集合。
如果您需要许多不同位置的所有值的列表,请考虑调用GetValues
一次,并将结果caching在只读封装中,例如:
public static readonly ReadOnlyCollection<SomeEnum> AllSomeEnumValues = Array.AsReadOnly((SomeEnum[])Enum.GetValues(typeof(SomeEnum)));
然后,您可以多次使用AllSomeEnumValues
,并且可以安全地重复使用相同的集合。
为什么使用.Cast<SomeEnum>()
?
许多其他答案使用.Cast<SomeEnum>()
。 这个问题是它使用Array
类的非genericsIEnumerable
实现。 这应该包括将每个值装箱到一个System.Object
框中,然后使用Cast<>
方法重新取消所有这些值。 幸运的是.Cast<>
方法似乎在开始迭代集合之前检查其IEnumerable
参数的运行时types( this
参数),因此它毕竟不是那么糟糕。 事实certificate.Cast<>
让同一个数组实例通过。
如果按照.ToArray()
或.ToList()
,如下所示:
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList() // DON'T do this
你有另一个问题:当你调用GetValues
,然后用.ToList()
调用创build一个新的集合( List<>
)时,你创build一个新的集合(数组)。 所以这是整个集合的一个(额外)冗余分配来保存这些值。
List <SomeEnum> theList = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList();
这是我喜欢的方式,使用LINQ:
public class EnumModel { public int Value { get; set; } public string Name { get; set; } } public enum MyEnum { Name1=1, Name2=2, Name3=3 } public class Test { List<EnumModel> enums = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => new EnumModel() { Value = (int)c, Name = c.ToString() }).ToList(); }
希望能帮助到你
很简单的答案
这是我在我的一个应用程序中使用的属性
public List<string> OperationModes { get { return Enum.GetNames(typeof(SomeENUM)).ToList(); } }
我一直习惯得到像这样的enum
值列表:
Array list = Enum.GetValues(typeof (SomeEnum));
这里有用…一些代码获取值到一个列表,它将enum转换为文本的可读forms
public class KeyValuePair { public string Key { get; set; } public string Name { get; set; } public int Value { get; set; } public static List<KeyValuePair> ListFrom<T>() { var array = (T[])(Enum.GetValues(typeof(T)).Cast<T>()); return array .Select(a => new KeyValuePair { Key = a.ToString(), Name = a.ToString().SplitCapitalizedWords(), Value = Convert.ToInt32(a) }) .OrderBy(kvp => kvp.Name) .ToList(); } }
..和支持的System.String扩展方法:
/// <summary> /// Split a string on each occurrence of a capital (assumed to be a word) /// eg MyBigToe returns "My Big Toe" /// </summary> public static string SplitCapitalizedWords(this string source) { if (String.IsNullOrEmpty(source)) return String.Empty; var newText = new StringBuilder(source.Length * 2); newText.Append(source[0]); for (int i = 1; i < source.Length; i++) { if (char.IsUpper(source[i])) newText.Append(' '); newText.Append(source[i]); } return newText.ToString(); }
Language[] result = (Language[])Enum.GetValues(typeof(Language))
public class NameValue { public string Name { get; set; } public object Value { get; set; } } public class NameValue { public string Name { get; set; } public object Value { get; set; } } public static List<NameValue> EnumToList<T>() { var array = (T[])(Enum.GetValues(typeof(T)).Cast<T>()); var array2 = Enum.GetNames(typeof(T)).ToArray<string>(); List<NameValue> lst = null; for (int i = 0; i < array.Length; i++) { if (lst == null) lst = new List<NameValue>(); string name = array2[i]; T value = array[i]; lst.Add(new NameValue { Name = name, Value = value }); } return lst; }
将枚举转换为列表更多信息在这里 。
/// <summary> /// Method return a read-only collection of the names of the constants in specified enum /// </summary> /// <returns></returns> public static ReadOnlyCollection<string> GetNames() { return Enum.GetNames(typeof(T)).Cast<string>().ToList().AsReadOnly(); }
其中T是枚举types; 添加这个:
using System.Collections.ObjectModel;
private List<SimpleLogType> GetLogType() { List<SimpleLogType> logList = new List<SimpleLogType>(); SimpleLogType internalLogType; foreach (var logtype in Enum.GetValues(typeof(Log))) { internalLogType = new SimpleLogType(); internalLogType.Id = (int) (Log) Enum.Parse(typeof (Log), logtype.ToString(), true); internalLogType.Name = (Log)Enum.Parse(typeof(Log), logtype.ToString(), true); logList.Add(internalLogType); } return logList; }
在顶部的代码中,日志是一个枚举,SimpleLogType是日志的结构。
public enum Log { None = 0, Info = 1, Warning = 8, Error = 3 }
你可以使用下面的通用方法:
public static List<T> GetItemsList<T>(this int enums) where T : struct, IConvertible { if (!typeof (T).IsEnum) { throw new Exception("Type given must be an Enum"); } return (from int item in Enum.GetValues(typeof (T)) where (enums & item) == item select (T) Enum.Parse(typeof (T), item.ToString(new CultureInfo("en")))).ToList(); }
如果你想Enum int作为键和名称作为值,如果你把这个数字存储到数据库,那么它是来自Enum!
void Main() { ICollection<EnumValueDto> list = EnumValueDto.ConvertEnumToList<SearchDataType>(); foreach (var element in list) { Console.WriteLine(string.Format("Key: {0}; Value: {1}", element.Key, element.Value)); } /* OUTPUT: Key: 1; Value: Boolean Key: 2; Value: DateTime Key: 3; Value: Numeric */ } public class EnumValueDto { public int Key { get; set; } public string Value { get; set; } public static ICollection<EnumValueDto> ConvertEnumToList<T>() where T : struct, IConvertible { if (!typeof(T).IsEnum) { throw new Exception("Type given T must be an Enum"); } var result = Enum.GetValues(typeof(T)) .Cast<T>() .Select(x => new EnumValueDto { Key = Convert.ToInt32(x), Value = x.ToString(new CultureInfo("en")) }) .ToList() .AsReadOnly(); return result; } } public enum SearchDataType { Boolean = 1, DateTime, Numeric }