比较Enum值进行排序

时间:2013-05-13 08:30:35

标签: c# sorting enums comparison

在项目中,我有一个外部枚举(从服务引用生成)。 所以我不能改变枚举值。

如何以有效的方式将这些枚举值相互比较?

这是枚举

的示例
public enum Values
{
    A,
    B,
    C,
    D,
    E,
    F,
    G,
    H
}

我想要的排序顺序是不一样的(像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...
    }
}

这可以更有效吗?

3 个答案:

答案 0 :(得分:4)

我认为最简单的方法是以这种方式实现比较功能:

public static int CompareTo(this Values x, Values y)
{
    var sortOrder = new[] {
        Values.F,
        Values.H,
        Values.C,
        Values.D,
        Values.B,
        Values.A,
        Values.E,
        Values.G
    };

    return Array.IndexOf(sortOrder, x) - Array.IndexOf(sortOrder, y);
}

当然,您希望将sortOrder的初始化移到函数外部,以便它只运行一次。

关于选择数组作为编码所需排序的数据结构:不仅是最简单的,而且对于这么少的项目,线性搜索也可能是最快的。

答案 1 :(得分:2)

如果你想做的只是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]);
}

但是,我不确定为什么要实现名为CompareTo的扩展方法,但我希望你希望它覆盖{{1} }。例如,

Enum.CompareTo

答案 2 :(得分:2)

而不是枚举ValuesOrdered使用静态只读SortedList(你不能对SortedList使用常量),如下所示:

private static readonly SortedList<Values, int> ordered = new SortedList<Values, int> 
    {
        {Values.F,0},
        {Values.H,1},
        {Values.C,2},
        {Values.D,3},
        {Values.B,4},
        {Values.A,5},
        {Values.E,6},
        {Values.G,7},
    };

方法“CompareTo”将是这样的:

public static int CompareTo(this Values x, Values y)
    {
        return Comparer<int>.Default.Compare(ordered[x], ordered[y]);
    }

享受! : - )