2013-04-10 49 views
3

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

舉例來說,如果我有

enum Permissions 
{ 
    None, 
    Read, 
    Write, 
    Full 
} 

有沒有讓我做Helper.Max(Permissions.Read, Permissions.Full)並獲得Permissions.Full,例如一種方法?

+1

那豈不是很容易寫一個快速的函數,它接受其中兩個作爲參數,並比較它們被稱爲? – tnw 2013-04-10 18:49:01

回答

10

枚舉實現IComparable所以你可以使用:

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

沒有考慮到他們可能會實現'IComparable' - 這恰好可以做到這一點。 – 2013-04-10 18:57:18

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

您可以將其轉換爲枚舉基礎類型(通過'Enum.GetUnderlyingType'獲取它),然後對其執行最小/最大值。 – Oded 2013-04-10 18:52:03

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); 
+0

如果枚舉基於'long',會怎樣? – Oded 2013-04-10 18:52:21

+2

@Oded然後,編譯器的警告應該很清楚地表明,修復是微不足道的...... – Servy 2013-04-10 18:52:46

+0

@Obed,你只需要改變你的演員類型爲'long'。 – 2013-04-10 18:54:25

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

} 
0

可以用2個或多個參數

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