获取枚举的最大值

你如何得到一个枚举的最大值?

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

…当你的一些枚举值是负数时这将起作用。

我同意马特的回答。 如果你只需要最小和最大的int值,那么你可以这样做,如下所示。

最大:

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

最低:

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

根据马特·汉密尔顿的回答,我想为它创build一个扩展方法。

由于ValueType不被接受为genericstypes参数约束,所以我没有find一个更好的方法来将T限制为Enum但下面的内容。

任何想法将非常感激。

PS。 请忽略我的VB隐含性,我喜欢用这种方式使用VB,这是VB的优势,这就是为什么我喜欢VB。

Howeva,这里是:

C#:

 static void Main(string[] args) { MyEnum x = GetMaxValue<MyEnum>(); } public static TEnum GetMaxValue<TEnum>() where TEnum : IComparable, IConvertible, IFormattable { 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,但任何枚举的实际最大值是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()); } } 

使用Lastfunction无法获得最大值。 使用“最大”function即可。 喜欢:

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

在System.Enum下有获取有关枚举types信息的方法。

所以,在Visual Studio中的VB.Net项目中,我可以键入“System.Enum”。 智慧带来各种善良。

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

在我的情况下,我的枚举值从零开始,并跳过没有数字,所以要获得我的枚举的最大值,我只需要知道在数组中有多less元素。

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

与Matthew J Sullivan达成一致,对于C#:

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

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

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

……从语义上来说,一字一句似乎没有什么意义呢? (总是有不同的方式,但我不认为后者有好处。)

在F#中,用一个帮助函数将enum转换为一个序列:

 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 
 >键入Foo = |  Fizz = 3 |  Bang = 2
 > val ToSeq:'A  - > seq <'B> when'A:enum <'B>
 > val FooMax:Foo = Fizz

编译器不需要定义“when”A:enum <'B>“,但即使使用有效的枚举types,也需要使用ToSeq。