枚举值的最小和最大操作

时间:2013-04-10 18:47:06

标签: c#

使用C#,我如何获取两个枚举值的最小值或最大值?

例如,如果我有

enum Permissions
{
    None,
    Read,
    Write,
    Full
}

是否有一种方法可以让我Helper.Max(Permissions.Read, Permissions.Full)并获取Permissions.Full,例如?

6 个答案:

答案 0 :(得分:13)

枚举实施IComparable,以便您可以使用:

public static T Min<T>(T a, T b) where T : IComparable
{
    return a.CompareTo(b) <= 0 ? a : b;
}

答案 1 :(得分:2)

由于枚举可以转换为整数类型,您可以这样做:

   var permissions1 = Permissions.None;
   var permissions2 = Permissions.Full;
   var maxPermission = (Permissions) Math.Max((int) permissions1, (int) permissions2);

请注意,如果您的枚举基于无符号类型或长度超过32位的类型(即long或ulong),则此可能会导致问题,但在这种情况下,您只需更改输入枚举的类型,以匹配枚举中声明的类型。

即,对于声明为:

的枚举
enum Permissions : ulong
{
    None,
    Read,
    Write,
    Full
}

你会使用:

   var permissions1 = Permissions.None;
   var permissions2 = Permissions.Full;
   var maxPermission = (Permissions) Math.Max((ulong) permissions1, (ulong) permissions2);

答案 2 :(得分:0)

这就是我提出的,因为我在.NET中找不到任何可以做到这一点的东西。

public static class EnumHelper
{
    public static T Min<T>(T a, T b)
    {
        return (dynamic)a < (dynamic)b ? a : b;
    }

    public static T Max<T>(T a, T b)
    {
        return (dynamic)a > (dynamic)b ? a : b;
    }
}

答案 3 :(得分:0)

我想你想要这样的东西:

public enum Enum1
{
    A_VALUE,
    B_VALUE,
    C_VALUE
}

public enum Enum2
{
    VALUE_1,
    VALUE_2,
    VALUE_3
}

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();

        Console.WriteLine(p.EnumMin<Enum1>());
        Console.WriteLine(p.EnumMax<Enum2>());

    }


    T EnumMin<T>()
    {
        T ret; ;
        Array x = Enum.GetValues(typeof(T));
        ret  = (T) x.GetValue(0);
        return ret;
    }

    T EnumMax<T>()
    {
        T ret; ;
        Array x = Enum.GetValues(typeof(T));
        ret = (T)x.GetValue(x.Length-1);
        return ret;
    }

}

答案 4 :(得分:0)

可以使用2个或更多参数调用

    public static T GetMaxEnum<T>(params T[] enums) where T : struct, IConvertible
    {
        if (enums.Length < 2)
        {
            throw new InvalidEnumArgumentException();
        }
        return enums.Max();
    }

答案 5 :(得分:0)

有一种一站式方法可以获取任何枚举的最小值和最大值。它只假设表示类型是 int

    public Tuple<int,int> GetMinMaxOfEnumeration<T>()
    {
        if (!typeof (T).IsEnum)
        {
            throw new ArgumentException("Type must be an enumeration");
        }
        var valuesAsInt = Enum.GetValues(typeof (T)).Cast<int>().OrderBy(n => n).ToArray();
        return new Tuple<int, int>(valuesAsInt.First(), valuesAsInt.Last());
    }