문제

열거형의 최대값을 어떻게 얻나요?

도움이 되었습니까?

해결책

Enum.GetValues()는 값을 순서대로 반환하는 것으로 보이므로 다음과 같이 할 수 있습니다.

// given this enum:
public enum Foo
{
    Fizz = 3, 
    Bar = 1,
    Bang = 2
}

// this gets Fizz
var lastFoo = Enum.GetValues(typeof(Foo)).Cast<Foo>().Last();

편집하다

댓글을 읽고 싶지 않은 분들을 위해:다음 방법으로 수행할 수도 있습니다.

var lastFoo = Enum.GetValues(typeof(Foo)).Cast<Foo>().Max();

...이는 열거형 값 중 일부가 음수일 때 작동합니다.

다른 팁

나는 Matt의 대답에 동의합니다. 최소 및 최대 INT 값이 필요한 경우 다음과 같이 수행 할 수 있습니다.

최고:

Enum.GetValues(typeof(Foo)).Cast<int>().Max();

최저한의:

Enum.GetValues(typeof(Foo)).Cast<int>().Min();

Matt Hamilton의 답변에 따르면, 나는 그것에 대한 확장 방법을 만드는 것을 생각했습니다.

부터 ValueType 일반적인 유형 매개 변수 제한 조건으로 허용되지 않으므로 제한하는 더 나은 방법을 찾지 못했습니다. T 에게 Enum 그러나 다음은 다음과 같습니다.

어떤 아이디어라도 정말 감사 할 것입니다.

추신. 내 VB 함정을 무시하십시오. 저는 VB를 이런 식으로 사용하는 것을 좋아합니다. 그것이 VB의 강점이며, 그것이 내가 VB를 좋아하는 이유입니다.

Howeva, 여기에 :

씨#:

static void Main(string[] args)
{
    MyEnum x = GetMaxValue<MyEnum>();
}

public static TEnum GetMaxValue<TEnum>() 
    where TEnum : IComparable, IConvertible, IFormattable
    //In C#>=7.3 substitute with 'where TEnum : Enum', and remove the following check:
{
    Type type = typeof(TEnum);

    if (!type.IsSubclassOf(typeof(Enum)))
        throw new
            InvalidCastException
                ("Cannot cast '" + type.FullName + "' to System.Enum.");

    return (TEnum)Enum.ToObject(type, Enum.GetValues(type).Cast<int>().Last());
}

enum MyEnum
{
    ValueOne,
    ValueTwo
}

VB :

Public Function GetMaxValue _
    (Of TEnum As {IComparable, IConvertible, IFormattable})() As TEnum

    Dim type = GetType(TEnum)

    If Not type.IsSubclassOf(GetType([Enum])) Then _
        Throw New InvalidCastException _
            ("Cannot cast '" & type.FullName & "' to System.Enum.")

    Return [Enum].ToObject(type, [Enum].GetValues(type) _
                        .Cast(Of Integer).Last)
End Function

이것은 약간 nitpicky이지만 Enum의 실제 최대 값은 int32.maxvalue입니다 (int에서 파생 된 열거라고 가정). 실제로 그 값을 가진 멤버를 선언했는지 여부에 관계없이 INT32 값을 모든 열거에 시전하는 것은 완벽하게 합법적입니다.

합법적인:

enum SomeEnum
{
    Fizz = 42
}

public static void SomeFunc()
{
    SomeEnum e = (SomeEnum)5;
}

다른 시간을 시도한 후, 나는이 확장 방법을 얻었습니다.

public static class EnumExtension
{
    public static int Max(this Enum enumType)
    {           
        return Enum.GetValues(enumType.GetType()).Cast<int>().Max();             
    }
}

class Program
{
    enum enum1 { one, two, second, third };
    enum enum2 { s1 = 10, s2 = 8, s3, s4 };
    enum enum3 { f1 = -1, f2 = 3, f3 = -3, f4 };

    static void Main(string[] args)
    {
        Console.WriteLine(enum1.one.Max());        
    }
}

마지막 함수를 사용하면 최대 값을 얻을 수 없습니다. "max"함수를 사용하십시오. 처럼:

 class Program
    {
        enum enum1 { one, two, second, third };
        enum enum2 { s1 = 10, s2 = 8, s3, s4 };
        enum enum3 { f1 = -1, f2 = 3, f3 = -3, f4 };

        static void Main(string[] args)
        {
            TestMaxEnumValue(typeof(enum1));
            TestMaxEnumValue(typeof(enum2));
            TestMaxEnumValue(typeof(enum3));
        }

        static void TestMaxEnumValue(Type enumType)
        {
            Enum.GetValues(enumType).Cast<Int32>().ToList().ForEach(item =>
                Console.WriteLine(item.ToString()));

            int maxValue = Enum.GetValues(enumType).Cast<int>().Max();     
            Console.WriteLine("The max value of {0} is {1}", enumType.Name, maxValue);
        }
    }

C#: Matthew J Sullivan과 일치하여 :

   Enum.GetValues(typeof(MyEnum)).GetUpperBound(0);

왜 누군가가 사용하고 싶은지 잘 모르겠습니다.

   Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Last();

... 의미 적으로 말하자면, 단어와 같은 말로, 그것은 의미가없는 것 같지 않습니까? (항상 다른 방법을 갖는 것이 좋지만 후자의 이점은 보이지 않습니다.)

System.Enum 아래에 열거된 형식에 대한 정보를 가져오는 방법이 있습니다.

따라서 Visual Studio의 VB.Net 프로젝트에서 "System.Enum"을 입력 할 수 있으며 인텔리 센스는 모든 종류의 장점을 제공합니다.

특히 한 가지 메서드는 열거된 값의 배열을 반환하는 System.Enum.GetValues()입니다.어레이를 확보한 후에는 특정 상황에 적합한 모든 작업을 수행할 수 있어야 합니다.

제 경우에는 열거된 값이 0부터 시작하고 숫자를 건너뛰지 않았습니다. 따라서 열거형의 최대값을 얻으려면 배열에 몇 개의 요소가 있는지 알아야 합니다.

VB.Net 코드 조각:

'''''''

Enum MattType
  zerothValue         = 0
  firstValue          = 1
  secondValue         = 2
  thirdValue          = 3
End Enum

'''''''

Dim iMax      As Integer

iMax = System.Enum.GetValues(GetType(MattType)).GetUpperBound(0)

MessageBox.Show(iMax.ToString, "Max MattType Enum Value")

'''''''

F#에서, 열거를 시퀀스로 변환하는 도우미 함수를 갖는다.

type Foo =
    | Fizz  = 3
    | Bang  = 2

// Helper function to convert enum to a sequence. This is also useful for iterating.
// stackoverflow.com/questions/972307/can-you-loop-through-all-enum-values-c
let ToSeq (a : 'A when 'A : enum<'B>) =
    Enum.GetValues(typeof<'A>).Cast<'B>()

// Get the max of Foo
let FooMax = ToSeq (Foo()) |> Seq.max   

실행 ...

> type Foo = | Fizz = 3 | Bang = 2
> val ToSeq : 'A -> seq<'B> when 'A : enum<'B>
> val FooMax : Foo = Fizz

그만큼 when 'A : enum<'B> 정의에 대한 컴파일러는 필요하지 않지만 유효한 열거 유형에 의해서도 Toseq를 사용하는 데 필요합니다.

모든 상황에서 사용할 수있는 것은 아니지만 종종 최대 값을 직접 정의합니다.

enum Values {
  one,
  two,
  tree,
  End,
}

for (Values i = 0; i < Values.End; i++) {
  Console.WriteLine(i);
}

var random = new Random();
Console.WriteLine(random.Next((int)Values.End));

물론 이것은 열거에서 사용자 정의 값을 사용할 때 작동하지 않지만 종종 쉬운 솔루션이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top