c# - 比较枚举值进行排序

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

这可以更有效地实现吗?

最佳答案

我相信最简单的方法是以这种方式实现您的比较功能:

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 的初始化移动到函数外部,以便它只运行一次。

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

关于c# - 比较枚举值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16517749/

相关文章:

jQuery UI 可排序 - 保持不同宽度的 div 一个接一个

java - 我们如何在java中访问枚举的类型和子类型?

mysql - 在另一个表中引用 MySQL ENUM

swift - Swift 中带有基于字符串的枚举的下标字典

c# - 访问元素组件 silverlight

java - Applet 中的 Paint 方法(Java 中的排序算法)

algorithm - 有人可以向我解释为什么插入排序的最坏情况是 O(n^2) 吗?

c# - 使用 AngularJS 将 ASP.NET CORE Web 应用程序发布到 IIS

c# - 从表中获取最大值,除非为空

c# - 获取 IQueryable<T>,其中 T 的任何字段包含给定字符串