使用 C#,如何获取两个枚举值的最小值或最大值?
例如,如果我有
enum Permissions
{
None,
Read,
Write,
Full
}
例如,有没有一种方法可以让我做Helper.Max(Permissions.Read, Permissions.Full)
和得到Permissions.Full
?
使用 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());
}