Jak*_*son 990
这将返回IEnumerable<SomeEnum>
Enum的所有值中的一个.
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
Run Code Online (Sandbox Code Playgroud)
如果你想要的是一个List<SomeEnum>
,只需添加.ToList()
后.Cast<SomeEnum>()
.
要在Array上使用Cast函数,您需要System.Linq
在using部分中使用.
Gil*_*ili 99
更简单的方法:
Enum.GetValues(typeof(SomeEnum))
.Cast<SomeEnum>()
.Select(v => v.ToString())
.ToList();
Run Code Online (Sandbox Code Playgroud)
Jep*_*sen 79
简短的回答是,使用:
(SomeEnum[])Enum.GetValues(typeof(SomeEnum))
Run Code Online (Sandbox Code Playgroud)
如果你需要一个局部变量,那就是var allSomeEnumValues = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));
.
为什么这样的语法?!
该static
方法GetValues
是在旧的.NET 1.0天中引入的.它返回一个运行时类型的一维数组SomeEnum[]
.但由于它是一种非泛型方法(泛型直到.NET 2.0才引入),因此无法声明其返回类型(编译时返回类型).
.NET数组确实有一种协方差,但由于它SomeEnum
是一个值类型,并且因为数组类型协方差不适用于值类型,所以它们甚至不能将返回类型声明为object[]
或Enum[]
.(这是由例如不同的此过载的GetCustomAttributes
从.NET 1.0具有编译时返回类型object[]
但实际上返回类型的数组SomeAttribute[]
,其中SomeAttribute
必然是一个引用类型.)
因此,.NET 1.0方法必须将其返回类型声明为System.Array
.但我向你保证这是一个SomeEnum[]
.
每次GetValues
使用相同的枚举类型再次调用时,都必须分配一个新数组并将值复制到新数组中.这是因为数组可能被方法的"使用者"写入(修改),因此他们必须创建一个新数组以确保值不变..NET 1.0没有很好的只读集合.
如果您需要许多不同位置的所有值的列表,请考虑GetValues
只调用一次并将结果缓存在只读包装器中,例如:
public static readonly ReadOnlyCollection<SomeEnum> AllSomeEnumValues
= Array.AsReadOnly((SomeEnum[])Enum.GetValues(typeof(SomeEnum)));
Run Code Online (Sandbox Code Playgroud)
然后您可以AllSomeEnumValues
多次使用,并且可以安全地重复使用相同的集合.
为什么使用不好.Cast<SomeEnum>()
?
许多其他答案使用.Cast<SomeEnum>()
.这个问题是它使用了类的非泛型IEnumerable
实现Array
.这应该包括将每个值装入一个System.Object
框,然后使用该Cast<>
方法再次打开所有这些值.幸运的是,该.Cast<>
方法似乎在开始迭代集合之前检查其IEnumerable
参数(this
参数)的运行时类型,所以它毕竟不是那么糟糕.结果是.Cast<>
让同一个数组实例通过.
如果你遵循它,.ToArray()
或者.ToList()
如下:
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList() // DON'T do this
Run Code Online (Sandbox Code Playgroud)
您还有另一个问题:在调用时创建一个新集合(数组)GetValues
,然后List<>
使用该.ToList()
调用创建一个新集合().这是整个集合的一个(额外)冗余分配来保存值.
Boo*_*ooo 30
这是我喜欢的方式,使用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();
// A list of Names only, does away with the need of EnumModel
List<string> MyNames = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => c.ToString()).ToList();
// A list of Values only, does away with the need of EnumModel
List<int> myValues = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => (int)c).ToList();
// A dictionnary of <string,int>
Dictionary<string,int> myDic = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).ToDictionary(k => k.ToString(), v => (int)v);
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你
小智 20
List <SomeEnum> theList = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList();
Run Code Online (Sandbox Code Playgroud)
Tyl*_*ler 12
非常简单的答案
这是我在我的一个应用程序中使用的属性
public List<string> OperationModes
{
get
{
return Enum.GetNames(typeof(SomeENUM)).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
将 Enum 转换为列表此处提供更多信息。
这里有用...用于将值放入列表的一些代码,它将枚举转换为文本的可读形式
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();
}
}
Run Code Online (Sandbox Code Playgroud)
..和支持System.String扩展方法:
/// <summary>
/// Split a string on each occurrence of a capital (assumed to be a word)
/// e.g. 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();
}
Run Code Online (Sandbox Code Playgroud)
我总是习惯得到enum
像这样的值列表:
Array list = Enum.GetValues(typeof (SomeEnum));
Run Code Online (Sandbox Code Playgroud)
Language[] result = (Language[])Enum.GetValues(typeof(Language))
Run Code Online (Sandbox Code Playgroud)