You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中正确排序不同长度的字符串数组(不使用内置排序)

解决不同长度字符串的自定义字典序排序问题

问题分析

你的代码存在两个核心问题,导致长短字符串排序异常:

  1. 前缀场景未处理:当一个字符串是另一个的前缀(比如"AA"和"A"),代码在字符循环匹配结束后直接break,没有比较两者长度,导致长字符串错误排在短字符串前面。
  2. 交换逻辑颠倒:当前面字符串的字符小于后面时就交换,这会让大字符的字符串留在前面,完全反转了升序排序的逻辑。

正确的字典序规则

要实现标准字母排序,需遵循:

  • 逐个字符比较,第一个不同字符ASCII值更小的字符串排前;
  • 若一个字符串是另一个的前缀,较短的字符串排前(例如"A" < "AA" < "AAA")。

修正后的代码实现

// 冒泡排序实现自定义字典序升序排序
for (int i = 0; i < copy_database.Length - 1; i++)
{
    for (int j = 0; j < copy_database.Length - 1 - i; j++)
    {
        if (copy_database[j].Value != null && copy_database[j + 1].Value != null)
        {
            string str1 = copy_database[j].Value.Title;
            string str2 = copy_database[j + 1].Value.Title;
            int k = 0;
            int minLength = Math.Min(str1.Length, str2.Length);

            // 逐个字符匹配,直到找到不同字符或其中一个字符串结束
            while (k < minLength && str1[k] == str2[k])
            {
                k++;
            }

            bool needSwap = false;
            if (k < minLength)
            {
                // 找到不同字符:前面字符串的字符更大则需要交换(升序)
                needSwap = str1[k] > str2[k];
            }
            else
            {
                // 前缀场景:前面字符串更长则需要交换(短字符串排前)
                needSwap = str1.Length > str2.Length;
            }

            if (needSwap)
            {
                // 交换两个元素
                Key_Value_Pair temp = copy_database[j];
                copy_database[j] = copy_database[j + 1];
                copy_database[j + 1] = temp;
            }
        }
    }
}

代码说明

  1. 提取两个字符串到临时变量str1和str2,简化后续代码;
  2. 字符循环结束后,分两种情况判断是否需要交换:
    • 找到不同字符时,若str1的字符更大,则交换,保证升序;
    • 前缀场景下,若str1更长,则交换,让短字符串排前;
  3. 移除了多余的break,确保冒泡排序的每一轮都能正确处理所有相邻元素。

测试验证

对于输入数组["AA", "A", "Z", "ZZZ"],排序后结果为:
["A", "AA", "Z", "ZZZ"],符合预期的字典序规则。

内容的提问来源于stack exchange,提问作者Iku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:06:17