回答:
Enum.GetNames
列挙型のすべての項目の名前を表す配列を返す静的メソッドを使用できます。この配列の長さプロパティは、列挙型で定義されたアイテムの数と同じです
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
質問は:
列挙型で定義されているアイテムの数を取得するにはどうすればよいですか?
「アイテム」の数は、実際には2つのまったく異なるものを意味する可能性があります。次の例を考えてみましょう。
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
で定義されている「アイテム」の数はいくつMyEnum
ですか?
アイテムの数は5ですか?(A
、B
、C
、D
、E
)
それとも3ですか?(1
、2
、3
)
(5)で定義されている名前の数はMyEnum
、次のように計算できます。
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
(3)で定義された値の数はMyEnum
、次のように計算できます。
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;
この質問に対するCの回答で見た気の利いたトリックは、最後の要素を列挙型に追加し、それを使用して列挙型内の要素の数を通知するだけです。
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
0以外の開始値を定義している場合は、NumberOfTypes-Type1を使用して要素の数を確認できます。
この方法がEnumを使用するよりも速いかどうかはわかりません。また、この情報を確認するためのEnumがあるため、これが適切な方法と見なされるかどうかもわかりません。
Enum.GetNamesを使用して、列挙型の値のIEnumerableを返し、結果のIEnumerableを.Countできます。
GetNamesは、GetValuesとほとんど同じ結果を生成しますが、より高速です。
私は今これを調べていて、現在のソリューションの読みやすさに満足していませんでした。非公式または小規模なプロジェクトでコードを記述している場合は、「Length」と呼ばれる列挙型の末尾に別の項目を追加するだけで済みます。この方法では、次のように入力するだけです。
var namesCount = (int)MyEnum.Length;
もちろん、他の人があなたのコードを使用しようとしている場合-または、この場合私には当てはまらない他の多くの状況で確信している場合-この解決策は、悪いアドバイスからひどいところまであります。