簡體   English   中英

枚舉值的最小和最大操作

[英]Min and Max operations on enum values

使用 C#,如何獲取兩個枚舉值的最小值或最大值?

例如,如果我有

enum Permissions
{
    None,
    Read,
    Write,
    Full
}

例如,有沒有一種方法可以讓我執行Helper.Max(Permissions.Read, Permissions.Full)並獲取Permissions.Full

枚舉實現IComparable以便您可以使用:

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

由於枚舉可以轉換為整數類型,您可以這樣做:

   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 個或更多參數調用

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

這就是我想出的,因為我在 .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;
    }
}

我想你想要這樣的東西:

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

}

有一種一站式方法可以獲取任何枚舉的最小值和最大值。 它只假設表示類型是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());
    }

雖然這個問題很老,但它出現在我進行的一些搜索的頂部,所以我們在這里 go,比現有答案更詳細一些:

Permissions p1 = Permissions.Read;
Permissions p2 = Permissions.Write;

var pMax = (Permissions)Math.Max( (int)p1, (int)p2 );

或者,如果枚舉是基於長的:

var pMax = (Permissions)Math.Max( (long)p1, (long)p2 );

為什么這行得通?

  • enum值可以轉換為int (或“long”),代表它們的 position
  • 一個int可以轉換回一個enum
  • Math.Max()顯然適用於int

旁注:

  • 顯然這也適用於Math.Min()的最小值
  • 如果您需要兩個以上enum值的最大值或最小值(如果您不介意System.Linq ),則可以使用IEnumerable.Max()IEnumerable.Min() ) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM