5

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

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

这是枚举的示例

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...
    }
}

这可以更有效地实现吗?

4

3 回答 3

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外部,以便它只运行一次。

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

于 2013-05-13T08:57:30.033 回答
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]);
}

但是,我不确定为什么要实现一个名为 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
于 2013-05-13T08:55:35.947 回答
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]);
    }

享受!:-)

于 2013-05-13T09:22:38.807 回答