c# - 提高字符串数组自定义排序的性能

标签 c# arrays performance algorithm sorting

我正在尝试找到一种有效的方法来根据数组的每个字符串元素中的数值对字符串数组进行排序。我目前正在使用 Array.Sort(array, customComparer) 静态方法(快速排序),我的自定义比较器类(按降序排序)是:

class StringComparer : IComparer<string>
{
    public int Compare(string a, string b)
    {
        string s1 = a;
        string s2 = b;

        Match matchA = Regex.Match(s1, @"\d+$");
        Match matchB = Regex.Match(s2, @"\d+$");

        long numberA = long.Parse(matchA.Value);
        long numberB = long.Parse(matchB.Value);

        if (numberB - numberA < 0)
        {
            return -1;
        }
        else 
        {
            return 1;
        }
    }
}

这非常有效,但有时排序会花费太多时间,在 2.4Ghz 处理器上,一个包含 100 000 个字符串的数组需要一分钟多的时间。我想知道是否有更有效的方法来完成同样的事情。例如,实现不同的排序算法或采用另一种方法,如使用字典和对值进行排序(值是字符串的数字部分)。有什么建议么?提前致谢!

最佳答案

您正在解析每个比较的值。我建议您解析一次,以获得字符串/长对,对其进行排序,然后提取字符串部分。

请注意,您现有的代码有一个错误:对于比较相等的两个字符串,它永远不会返回 0。

这是使用 LINQ 的替代方法(不是就地排序,但很简单。)

var sorted = unsorted.OrderBy(x => long.Parse(Regex.Match(x, @"\d+$").Value));
                     .ToList();

(OrderBy 投影一次获取键,然后比较键。)

关于c# - 提高字符串数组自定义排序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9251184/

相关文章:

调整具有大量控件的窗口大小时的 WPF 性能问题

javascript - 如何检测由贝塞尔曲线制成的物体与圆之间的碰撞?

c# - 将 base 64 字符串转换为图像并保存

c# - netstandard1.x 和 winforms/wpf/windows - 无法加载文件或程序集 System.Runtime,版本=4.1.0.0

c++ - C++中的动态长度数组

ios - 如何从数组中获取特定值的对象

C# 创建 excel 工作表后期绑定(bind)

javascript - Response.Redirect 在 JsonResult 中

等效 LINQ 查询的 C# 代码

php - 哪个更快 : to run the same sql query twice or run only once and store the result in arrays?