Mar*_*tus 5 c# sorting comparison enums
在一个项目中,我有一个外部枚举(从服务引用生成)。所以我不能改变枚举值。
如何以有效的方式将这些枚举值相互比较?
这里是一个枚举的例子
public enum Values
{
A,
B,
C,
D,
E,
F,
G,
H
}
Run Code Online (Sandbox Code Playgroud)
我想要它们的排序顺序不一样(比如 F、H、A、C、B ……)
现在我有一个带有一些比较的扩展方法。(有另一个枚举我想要的顺序)
public static int CompareTo(this Values x, Values y)
{
var orderedX = GetOrderedValues(x);
var orderedY = GetOrderedValues(y);
return orderedX.CompareTo(orderedY);
}
internal enum ValuesOrdered
{
F = 0,
H = 1,
C = 2,
D = 3,
B = 4,
A = 5,
E = 6,
G = 7
}
internal static ValuesOrdered GetOrderedValues(this Values x)
{
switch (x)
{
case Values.A:
{
return ValuesOrdered.A;
}
// and so on...
}
}
Run Code Online (Sandbox Code Playgroud)
这可以更有效地实现吗?
如果您只想做CompareTo,那么我认为您可以通过使用字典来简化它:
static Dictionary<Values, int> order = new Dictionary<Values, int>
{
{Values.A, 3},
{Values.B, 5},
{Values.C, 4},
{Values.D, 6},
{Values.E, 8},
{Values.F, 1},
{Values.G, 7},
{Values.H, 2}
};
public static int CompareTo(this Values x, Values y)
{
return order[x].CompareTo(order[y]);
}
Run Code Online (Sandbox Code Playgroud)
但是,我不确定为什么要实现名为 CompareTo 的扩展方法,但我希望您不要期望它会覆盖Enum.CompareTo. 例如,
var values = Enum.GetValues(typeof(Values)).Cast<Values>().ToArray();
Array.Sort(values);
Console.WriteLine(string.Join(" ", values));
//OUTPUT: A B C D E F G H
Run Code Online (Sandbox Code Playgroud)