获取枚举的最大值

时间:2023-01-26 14:05:45

How do you get the max value of an enum?

你如何获得枚举的最大值?

9 个解决方案

#1


175  

Enum.GetValues() seems to return the values in order, so you can do something like this:

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

Edit

For those not willing to read through the comments: You can also do it this way:

对于那些不愿意阅读评论的人:你也可以这样做:

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

... which will work when some of your enum values are negative.

...当你的一些枚举值为负数时,它会起作用。

#2


32  

I agree with Matt's answer. If you need just min and max int values, then you can do it as follows.

我同意马特的回答。如果只需要min和max int值,则可以按如下方式执行。

Maximum:

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

Minimum:

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

#3


20  

According to Matt Hamilton's answer, I thought on creating an Extension method for it.

根据Matt Hamilton的回答,我想为它创建一个Extension方法。

Since ValueType is not accepted as a generic type parameter constraint, I didn't find a better way to restrict T to Enum but the following.

由于ValueType不被接受为泛型类型参数约束,因此我没有找到将T限制为Enum的更好方法,但以下内容。

Any ideas would be really appreciated.

任何想法都会非常感激。

PS. please ignore my VB implicitness, I love using VB in this way, that's the strength of VB and that's why I love VB.

PS。请忽略我的VB隐含性,我喜欢用这种方式使用VB,这就是VB的优点,这就是我喜欢VB的原因。

Howeva, here it is:

Howeva,这里是:

C#:

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

#4


13  

This is slightly nitpicky but the actual maximum value of any enum is Int32.MaxValue (assuming it's a enum derived from int). It's perfectly legal to cast any Int32 value to an any enum regardless of whether or not it actually declared a member with that value.

这有点挑剔,但任何枚举的实际最大值是Int32.MaxValue(假设它是从int派生的枚举)。将任何Int32值转换为任何枚举是完全合法的,无论它是否实际声明具有该值的成员。

Legal:

enum SomeEnum
{
    Fizz = 42
}

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

#5


9  

After tried another time, I got this extension method:

经过另一次尝试,我得到了这个扩展方法:

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

#6


5  

Use the Last function could not get the max value. Use the "max" function could. Like:

使用Last函数无法获得最大值。使用“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);
        }
    }

#7


3  

There are methods for getting information about enumerated types under System.Enum.

有一些方法可以在System.Enum下获取有关枚举类型的信息。

So, in a VB.Net project in Visual Studio I can type "System.Enum." and the intellisense brings up all sorts of goodness.

因此,在Visual Studio的VB.Net项目中,我可以输入“System.Enum”。 intellisense带来了各种各样的善良。

One method in particular is System.Enum.GetValues(), which returns an array of the enumerated values. Once you've got the array, you should be able to do whatever is appropriate for your particular circumstances.

一种方法特别是System.Enum.GetValues(),它返回枚举值的数组。一旦你有阵列,你应该能够做任何适合你的特定情况。

In my case, my enumerated values started at zero and skipped no numbers, so to get the max value for my enum I just need to know how many elements were in the array.

在我的例子中,我的枚举值从零开始并没有跳过任何数字,所以要获得我的枚举的最大值,我只需要知道数组中有多少元素。

VB.Net code snippets:

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")

'''''''

#8


3  

In agreement with Matthew J Sullivan, for C#:

与Matthew J Sullivan达成协议,C#:

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

I'm really not sure why anyone would want to use:

我真的不确定为什么有人想要使用:

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

...As word-for-word, semantically speaking, it doesn't seem to make as much sense? (always good to have different ways, but I don't see the benefit in the latter.)

......从语义上说,逐字逐句地说它似乎没那么有意义吗? (总是很好,有不同的方式,但我没有看到后者的好处。)

#9


2  

In F#, with a helper function to convert the enum to a sequence:

在F#中,使用辅助函数将枚举转换为序列:

type Foo =
    | Fizz  = 3
    | Bang  = 2

// Helper function to convert enum to a sequence. This is also useful for iterating.
// *.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   

Running it...

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

The when 'A : enum<'B> is not required by the compiler for the definition, but is required for any use of ToSeq, even by a valid enum type.

编译器不需要何时'A:enum <'B>,但是对于任何ToSeq的使用都是必需的,即使是有效的枚举类型也是如此。

#1


175  

Enum.GetValues() seems to return the values in order, so you can do something like this:

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

Edit

For those not willing to read through the comments: You can also do it this way:

对于那些不愿意阅读评论的人:你也可以这样做:

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

... which will work when some of your enum values are negative.

...当你的一些枚举值为负数时,它会起作用。

#2


32  

I agree with Matt's answer. If you need just min and max int values, then you can do it as follows.

我同意马特的回答。如果只需要min和max int值,则可以按如下方式执行。

Maximum:

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

Minimum:

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

#3


20  

According to Matt Hamilton's answer, I thought on creating an Extension method for it.

根据Matt Hamilton的回答,我想为它创建一个Extension方法。

Since ValueType is not accepted as a generic type parameter constraint, I didn't find a better way to restrict T to Enum but the following.

由于ValueType不被接受为泛型类型参数约束,因此我没有找到将T限制为Enum的更好方法,但以下内容。

Any ideas would be really appreciated.

任何想法都会非常感激。

PS. please ignore my VB implicitness, I love using VB in this way, that's the strength of VB and that's why I love VB.

PS。请忽略我的VB隐含性,我喜欢用这种方式使用VB,这就是VB的优点,这就是我喜欢VB的原因。

Howeva, here it is:

Howeva,这里是:

C#:

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

#4


13  

This is slightly nitpicky but the actual maximum value of any enum is Int32.MaxValue (assuming it's a enum derived from int). It's perfectly legal to cast any Int32 value to an any enum regardless of whether or not it actually declared a member with that value.

这有点挑剔,但任何枚举的实际最大值是Int32.MaxValue(假设它是从int派生的枚举)。将任何Int32值转换为任何枚举是完全合法的,无论它是否实际声明具有该值的成员。

Legal:

enum SomeEnum
{
    Fizz = 42
}

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

#5


9  

After tried another time, I got this extension method:

经过另一次尝试,我得到了这个扩展方法:

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

#6


5  

Use the Last function could not get the max value. Use the "max" function could. Like:

使用Last函数无法获得最大值。使用“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);
        }
    }

#7


3  

There are methods for getting information about enumerated types under System.Enum.

有一些方法可以在System.Enum下获取有关枚举类型的信息。

So, in a VB.Net project in Visual Studio I can type "System.Enum." and the intellisense brings up all sorts of goodness.

因此,在Visual Studio的VB.Net项目中,我可以输入“System.Enum”。 intellisense带来了各种各样的善良。

One method in particular is System.Enum.GetValues(), which returns an array of the enumerated values. Once you've got the array, you should be able to do whatever is appropriate for your particular circumstances.

一种方法特别是System.Enum.GetValues(),它返回枚举值的数组。一旦你有阵列,你应该能够做任何适合你的特定情况。

In my case, my enumerated values started at zero and skipped no numbers, so to get the max value for my enum I just need to know how many elements were in the array.

在我的例子中,我的枚举值从零开始并没有跳过任何数字,所以要获得我的枚举的最大值,我只需要知道数组中有多少元素。

VB.Net code snippets:

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")

'''''''

#8


3  

In agreement with Matthew J Sullivan, for C#:

与Matthew J Sullivan达成协议,C#:

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

I'm really not sure why anyone would want to use:

我真的不确定为什么有人想要使用:

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

...As word-for-word, semantically speaking, it doesn't seem to make as much sense? (always good to have different ways, but I don't see the benefit in the latter.)

......从语义上说,逐字逐句地说它似乎没那么有意义吗? (总是很好,有不同的方式,但我没有看到后者的好处。)

#9


2  

In F#, with a helper function to convert the enum to a sequence:

在F#中,使用辅助函数将枚举转换为序列:

type Foo =
    | Fizz  = 3
    | Bang  = 2

// Helper function to convert enum to a sequence. This is also useful for iterating.
// *.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   

Running it...

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

The when 'A : enum<'B> is not required by the compiler for the definition, but is required for any use of ToSeq, even by a valid enum type.

编译器不需要何时'A:enum <'B>,但是对于任何ToSeq的使用都是必需的,即使是有效的枚举类型也是如此。