web-dev-qa-db-ja.com

列挙型に定義されたアイテムの総数

列挙型で定義されている項目の数を取得する方法

278
Rashmi Pandit

列挙型内のすべての項目の名前を表す配列を返す静的メソッド Enum.GetNames を使用できます。この配列のlengthプロパティは、enumで定義されているアイテムの数と同じです。

var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
379
Kasper Holdum

質問は:

列挙型で定義されている項目の数を取得する方法

「項目」の数は、実際にはまったく異なる2つのことを意味します。次の例を考えてください。

enum MyEnum
{
    A = 1,
    B = 2,
    C = 1,
    D = 3,
    E = 2
}

MyEnumname__に定義されている「項目」の数はいくつですか?

項目数は5ですか? (Aname__、Bname__、Cname__、Dname__、Ename__)

それとも3ですか? (123

MyEnumname__(5)で定義されているnamesの数は、次のように計算できます。

var namesCount = Enum.GetNames(typeof(MyEnum)).Length;

MyEnumname__(3)で定義されているvaluesの数は、次のように計算することができます。

var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
163
Timothy Shields

Enum.GetValues (typeof(MyEnum))。長さ。

70
Matt Hamilton

この質問に対するCの答えで見た気の利いたトリックは、列挙型に最後の要素を追加し、それを使用して列挙型内の要素の数を判断することです。

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

0以外の開始値を定義している場合は、NumberOfTypes - Type1を使用して要素数を確認できます。

この方法がEnumを使用するよりも速いかどうかはわかりません。また、Enumでこの情報を確認する必要があるため、これが適切な方法であると考えられるかどうかもわかりません。

12
Josh

Enum.GetNamesを使用して、enum内の値のIEnumerableを返してから、結果のIEnumerableをカウントできます。

GetNamesは、GetValuesとほぼ同じ結果を生成しますが、高速です。

6
Lucas Willett

上記の回答から、コードサンプルを追加するだけです。

 class Program
    {
        static void Main(string[] args)
        {
            int enumlen = Enum.GetNames(typeof(myenum)).Length;
            Console.Write(enumlen);
            Console.Read();
        }
        public enum myenum
        {
            value1,
            value2
        }
    }
6
jvanderh

私と同じくらい頻繁に上記の解決策を書いていると思うなら、それを一般的なものとして実装することができます:

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;
}
4
Matt Parkins

Visual Basicの場合

[Enum].GetNames(typeof(MyEnum)).Lengthは私とはうまくいきませんでしたが、[Enum].GetNames(GetType(Animal_Type)).lengthはうまくいきました。

1
S22

私は今これを調べていましたが、現在のソリューションの読みやすさに満足していませんでした。コードを非公式に、または小規模なプロジェクトで書いている場合は、列挙型の最後に "Length"という項目を追加するだけで済みます。このように、あなただけタイプする必要があります:

var namesCount = (int)MyEnum.Length;

もちろん、他の人があなたのコードを使用しようとしているなら - あるいはこの場合私には当てはまらなかった他の多くの状況の下で私は確信しています - この解決策は悪いから悪いものまでどこにでもあるかもしれません。

1
EnergyWasRaw