比较用于排序的枚举值

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)

这可以更有效地实现吗?

Ere*_*mez 3

如果您只想做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)