【发布时间】:2010-10-25 18:19:53
【问题描述】:
如何获取枚举中定义的项目数?
【问题讨论】:
如何获取枚举中定义的项目数?
【问题讨论】:
您可以使用静态方法Enum.GetNames,它返回一个表示枚举中所有项目名称的数组。此数组的长度属性等于枚举中定义的项目数
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
【讨论】:
问题是:
如何获取枚举中定义的项目数?
“项目”的数量实际上可能意味着两个完全不同的东西。请考虑以下示例。
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
MyEnum 中定义的“项目”数量是多少?
项目数是 5 吗? (A, B, C, D, E)
还是 3? (1, 2, 3)
MyEnum (5) 中定义的names 的数量可以计算如下。
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
MyEnum(3) 中定义的值个数可以计算如下。
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
【讨论】:
var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();。
Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...这样的打印机驱动程序的枚举中找到类似的东西;)。
Enum.GetValues(typeof(MyEnum)).Length;
【讨论】:
我今天运行了一个基准测试并得出了有趣的结果。这三个中:
var count1 = typeof(TestEnum).GetFields().Length;
var count2 = Enum.GetNames(typeof(TestEnum)).Length;
var count3 = Enum.GetValues(typeof(TestEnum)).Length;
GetNames(enum) 是迄今为止最快的!
| Method | Mean | Error | StdDev |
|--------------- |---------- |--------- |--------- |
| DeclaredFields | 94.12 ns | 0.878 ns | 0.778 ns |
| GetNames | 47.15 ns | 0.554 ns | 0.491 ns |
| GetValues | 671.30 ns | 5.667 ns | 4.732 ns |
【讨论】:
我在这个问题的 C 回答中看到的一个绝妙技巧,只需将最后一个元素添加到枚举中并用它来判断枚举中有多少元素:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
如果您定义的起始值不是 0,您可以使用 NumberOfTypes - Type1 来确定元素的数量。
我不确定这种方法是否会比使用 Enum 更快,我也不确定它是否被认为是执行此操作的正确方法,因为我们有 Enum 为我们确定此信息。
【讨论】:
您可以使用 Enum.GetNames 在您的枚举中返回一个 IEnumerable 值,然后对生成的 IEnumerable 进行计数。
GetNames 产生的结果与 GetValues 大致相同,但速度更快。
【讨论】:
从前面的答案中添加代码示例。
class Program
{
static void Main(string[] args)
{
int enumlen = Enum.GetNames(typeof(myenum)).Length;
Console.Write(enumlen);
Console.Read();
}
public enum myenum
{
value1,
value2
}
}
【讨论】:
如果您发现自己像我一样经常编写上述解决方案,那么您可以将其实现为泛型:
public static int GetEnumEntries<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetNames(typeof(T)).Length;
}
【讨论】:
对于 Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length 不适合我,但是
[Enum].GetNames(GetType(Animal_Type)).length 做到了。
【讨论】:
我刚才正在研究这个问题,对当前解决方案的可读性不满意。如果您正在非正式地编写代码或在一个小型项目中编写代码,您可以在枚举的末尾添加另一个名为“Length”的项目。这样,您只需输入:
var namesCount = (int)MyEnum.Length;
当然,如果其他人要使用您的代码 - 或者我确信在这种情况下不适用于我的许多其他情况 - 这个解决方案可能从不明智到糟糕。
【讨论】: