当前位置:  开发笔记 > 编程语言 > 正文

获取枚举的最大值

如何解决《获取枚举的最大值》经验,为你挑选了6个好方法。

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



1> Matt Hamilto..:

Enum.GetValues()似乎按顺序返回值,因此您可以执行以下操作:

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

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

编辑

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

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

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


如果您打算使用LINQ,为什么不使用Max(),这更清晰,并且不依赖于"似乎"?
我也投票支持Max().如果枚举不是负数,则Last()将失败,请参阅[此处](http://connect.microsoft.com/VisualStudio/feedback/details/98147/enum-getvalues)
不错.利用:"数组的元素按枚举常量的二进制值排序." 来自http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx
它表现得更好,但前提是枚举的值不是负值,它们可能是负值.
我是在咂嘴,认为这真是太过分了,但是给出了一个优雅的解决方案.此外,如果您想获取枚举值,请使用Convert.ToInt32().这是谷歌的结果.

2> Karanvir Kan..:

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

最大值:

Enum.GetValues(typeof(Foo)).Cast().Max();

最低:

Enum.GetValues(typeof(Foo)).Cast().Min();



3> Shimmy..:

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

由于ValueType不接受作为泛型类型参数约束,我没有找到更好的方法限制T,Enum但以下.

任何想法都会非常感激.

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

Howeva,这里是:

C#:

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

public static TEnum GetMaxValue() 
    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().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> JaredPar..:

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

法律:

enum SomeEnum
{
    Fizz = 42
}

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


@Cocowalla"pedantRY"
不知怎的,我真的不认为这是jdelator正在寻找的东西,但是有趣的迂腐:)
@Cocowalla +1给你评论使用"pedantism"

5> 小智..:

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

public static class EnumExtension
{
    public static int Max(this Enum enumType)
    {           
        return Enum.GetValues(enumType.GetType()).Cast().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> 小智..:

使用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().ToList().ForEach(item =>
                Console.WriteLine(item.ToString()));

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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有