获取枚举的最大值
你如何得到一个枚举的最大值?
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。