열거 형에 정의 된 총 항목 수


318

열거 형에 정의 된 항목 수를 어떻게 얻을 수 있습니까?

답변:


430

Enum.GetNames열거 형에있는 모든 항목의 이름을 나타내는 배열을 반환하는 정적 메서드 를 사용할 수 있습니다 . 이 배열의 길이 속성은 열거 형에 정의 된 항목 수와 같습니다.

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

1
합의 ... 여기 내가 찾은 링크는 csharp411.com/c-count-items-in-an-enum
SO User

8
Enum.GetValues를 사용할 수도 있습니다.
Xonatron

6
System 네임 스페이스를 아직 포함하지 않은 경우 System.Enum.GetNames
Brett Pennings 2019

4
그래서 오늘이 문제가 다시 발생했습니다. 아래의 다른 답변에 설명 된 C 스타일 트릭은 문제가 있지만 위에 나열된 Enum.GetValues ​​및 Enum.GetNames는 고정 길이를 얻기 위해 완전히 새로운 배열을 할당 할 위험이있는 것처럼 보입니다. 끔찍하다. 이 접근법이 실제로 동적 할당을 발생시키는 지 아는 사람이 있습니까? 그렇다면 특정 유스 케이스의 경우 가장 유연한 솔루션은 아니지만 가장 성능이 뛰어난 솔루션으로 보입니다.
J Trana 2016 년

174

질문은 ~이야:

열거 형에 정의 된 항목 수를 어떻게 얻을 수 있습니까?

"항목"의 수는 실제로 완전히 다른 두 가지를 의미 할 수 있습니다. 다음 예를 고려하십시오.

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();

2
마지막 줄을 쓰는 다른 방법 var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();.
Jeppe Stig Nielsen

3
내 인생에서 만난 개발자 중 그런 열거 형에 3 개의 항목이 포함되어 있다고 확인한 개발자는 생각할 수 없습니다.
motoDrizzt

2
@motoDrizzt 당신은 Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...;) 와 같은 프린터 드라이버의 열거에서 그런 것을 찾을 수 있습니다 .
shA.t


14

이 질문에 대한 C 답변에서 본 멋진 트릭은 열거 형에 마지막 요소를 추가하고 열거 형에 몇 개의 요소가 있는지 알려주는 데 사용합니다.

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

0 이외의 시작 값을 정의하는 경우 NumberOfTypes-Type1을 사용하여 요소 수를 확인할 수 있습니다.

Enum을 사용하는 것보다이 방법이 더 빠를 지 확신 할 수 없으며, Enum이이 정보를 확인해야하기 때문에이 방법이 올바른 방법으로 간주되는지 확실하지 않습니다.


1
GetNames를 사용할 수 없기 때문에 XNA에서이 작업을 수행 할 수 있으므로이 방법이 좋습니다
Thiago Valle

멋진 트릭입니다. GetNames ()보다 빠를 수도 있습니다.
Jordan LaPrise

4
foreach를 통해 열거 형을 순환하는 코드에주의하십시오-배열의 끝을 읽을 수 있습니다!
Michael Dorgan

4
또한 자체 값을 정의하는 열거 형에주의하십시오-종종 비트 플래그에 열거 형을 사용합니다.
Matt Parkins

1
또한 콤보 박스 및리스트 박스와 같은 일부 wpf 컨트롤에 대한 직접 열거 형 바인딩에주의하십시오.
mcy

6

이전 답변에서 코드 샘플 추가.

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

5

Enum.GetNames를 사용하여 열거 형에 IEnumerable 값을 반환 한 다음 결과 IEnumerable을 계산할 수 있습니다.

GetNames는 GetValues와 거의 동일한 결과를 생성하지만 더 빠릅니다.


5

위와 같은 솔루션을 자주 작성하는 경우 일반적인 방법으로 구현할 수 있습니다.

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;
}

1

나는 지금 이것을 조사하고 있었고 현재 솔루션의 가독성에 만족하지 않았습니다. 비공식적으로 또는 소규모 프로젝트에서 코드를 작성하는 경우 "Length"라는 열거 형 끝에 다른 항목을 추가 할 수 있습니다. 이런 식으로 다음을 입력하기 만하면됩니다.

var namesCount = (int)MyEnum.Length;

물론 다른 사람들이 귀하의 코드를 사용하려는 경우-또는이 경우 나에게 적용되지 않은 다른 많은 상황에서 확신 할 경우이 솔루션은 잘못된 조언에서 끔찍한 곳까지있을 수 있습니다.


2
이것은 또한 0에서 시작하는 열거 형에 의존합니다 (기본값은 아니지만 보장되지는 않습니다). 또한 일반적인 열거 형 사용에 대한 지능이 매우 혼란 스럽습니다. 이것은 거의 항상 끔찍한 생각입니다.
BradleyDotNET

2
오래 걸리지 않았습니다 :)
EnergyWasRaw

1
흥미롭게도, 더 좋은 일이 언제 올지 모른다고 생각합니다. 내 솔루션을 축소하려고 최선을 다했지만 공유하기에 충분히 흥미로 웠습니다!
EnergyWasRaw

1

Visual Basic의 경우 :

[Enum].GetNames(typeof(MyEnum)).Length나와 함께 일하지 않았지만 [Enum].GetNames(GetType(Animal_Type)).length해냈습니다.


왜 공감해야합니까? 이 문제는 c #으로 태그가 지정되었지만 여전히 유용한 VB의 올바른 구문입니다.
M Granja

2
질문에 C # 태그가 지정되어 있고이 답변에서 C #을 사용하지 않는다고 언급하지 않았을 가능성이 있습니다.
idbrii
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.