如何获取枚举类型中定义的项目数量?
Enum.GetNames
,它返回一个表示枚举中所有项名称的数组。该数组的长度属性等于枚举定义的项目数。var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
问题是:
如何获取枚举中定义的项数?
“项数”可能真正意味着两个完全不同的东西。考虑以下示例。
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
MyEnum
中定义的"items"数量是多少?
项目的数量是5吗?(A
, B
, C
, D
, E
)
还是3个?(1
, 2
, 3
)
可以按以下方式计算出在MyEnum
中定义的名称数目 (5)。
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();
。 - Jeppe Stig NielsenDefault = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...
;)。 - shA.tEnum.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
,然后使用 Count
计算结果的 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
有效。
var namesCount = (int)MyEnum.Length;
GetNames
的性能比GetValues
快了10倍,不知道是为什么。 - saastn