문제
열거형의 최대값을 어떻게 얻나요?
해결책
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));
물론 이것은 열거에서 사용자 정의 값을 사용할 때 작동하지 않지만 종종 쉬운 솔루션이 될 수 있습니다.