Bei
[AttributeUsage(AttributeTargets.Field)]
public class OrderAttribute : Attribute
{
public readonly int Order;
public OrderAttribute(int order)
{
Order = order;
}
}
public static class OrderHelper
{
public static int GetOrder<TEnum>(TEnum value) where TEnum : struct
{
int order;
if (!OrderHelperImpl<TEnum>.Values.TryGetValue(value, out order))
{
order = int.MaxValue;
}
return order;
}
private static class OrderHelperImpl<TEnum>
{
public static readonly Dictionary<TEnum, int> Values;
static OrderHelperImpl()
{
var values = new Dictionary<TEnum, int>();
var fields = typeof(TEnum).GetFields(BindingFlags.Static | BindingFlags.Public);
int unordered = int.MaxValue - 1;
for (int i = fields.Length - 1; i >= 0; i--)
{
FieldInfo field = fields[i];
var order = (OrderAttribute)field.GetCustomAttributes(typeof(OrderAttribute), false).FirstOrDefault();
int order2;
if (order != null)
{
order2 = order.Order;
}
else
{
order2 = unordered;
unordered--;
}
values[(TEnum)field.GetValue(null)] = order2;
}
Values = values;
}
}
}
Sie können dann:
int o1 = OrderHelper.GetOrder(MyEnum.ElementA);
int o2 = OrderHelper.GetOrder(MyEnum.ElementB);
int o3 = OrderHelper.GetOrder(MyEnum.ElementC);
So ist die Sortierung wie:
var myenums = new[] { MyEnum.ElementA, MyEnum.ElementB, MyEnum.ElementC };
Array.Sort(myenums, (p, q) => OrderHelper.GetOrder(p).CompareTo(OrderHelper.GetOrder(q)));
oder für LINQ:
var myenums = new[] { MyEnum.ElementA, MyEnum.ElementB, MyEnum.ElementC };
var sorted = myenums.OrderBy(x => OrderHelper.GetOrder(x));
Die OrderHelper
"caches" die Bestellung innerhalb einer OrderHelperImpl<TEnum>
. Die Werte der Enumeration werden extrahiert, indem man weiß, dass in enums die Werte public static
Felder sind (Sie können es leicht here sehen).
Werte ohne Order
sind in der gleichen Reihenfolge bestellt sie im enum
vorhanden sind, indem Sie die größtmögliche Werte eines int
mit knapp unter int.MaxValue
In welchem Kontext benötigen Sie diese Liste? In welcher Art von Sammlung speichern Sie die Enum-Werte? – phoog
Am Ende muss ich ein Array von Enum-Werten erhalten, aber sortiert –