C# を使用して、2 つの列挙値の最小値または最大値を取得するにはどうすればよいですか?
たとえば、私が持っている場合
enum Permissions
{
None,
Read,
Write,
Full
}
たとえば、実行Helper.Max(Permissions.Read, Permissions.Full)
して取得できる方法はありますか?Permissions.Full
C# を使用して、2 つの列挙値の最小値または最大値を取得するにはどうすればよいですか?
たとえば、私が持っている場合
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);
これは、これを行う .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;
}
}