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

冒泡排序实现TabCV排序+TabName字母序时遇IOrderedEnumerable索引错误求助

自定义多条件冒泡排序问题修复方案

问题场景

需实现对Sort类(包含string类型TabName、int类型TabCV)列表的排序规则:

  1. 优先按TabCV升序排列
  2. 当TabCV相同时,按TabName的字母序升序排列

自行编写冒泡排序时遇到两个问题:

  • 版本1代码报错:Cannot apply indexing with [] to an expression of type 'IOrderedEnumerable<Sort>'
  • 版本2代码仅前3个测试用例有效,后续结果混乱

测试用例输入字符串:

  • "103 123 4444 99 2000"
  • "2000 10003 1234000 44444444 9999 11 11 22 123"

错误原因分析

版本1错误原因

OrderBy方法返回的是IOrderedEnumerable<Sort>类型,这是一个延迟执行的序列,不支持直接用索引器[]访问元素,必须先转换为List或数组才能使用索引。

版本2错误原因

  1. OrderBy是非原地排序,它不会修改原集合,而是返回一个新的排序后的序列。调用tempList.OrderBy(...)但未接收返回值,原tempList完全没有变化。
  2. 排序条件错误:需求是按TabName排序,但代码中写的是x.TabCV.ToString(),逻辑完全不符合要求。

修复方案

方案1:规范的冒泡排序实现

直接在冒泡排序的比较逻辑中同时处理两个排序条件,无需额外依赖Linq,更符合冒泡排序的原生逻辑:

class Sort
{
    public string TabName { get; set; }
    public int TabCV { get; set; }
}

static List<Sort> BubbleSort(List<Sort> list)
{
    int n = list.Count;
    for (int j = 0; j < n - 1; j++)
    {
        bool swapped = false;
        // 每轮冒泡后,末尾的元素已处于正确位置,减少循环次数
        for (int i = 0; i < n - j - 1; i++)
        {
            bool needSwap = false;
            // 先比较TabCV
            if (list[i].TabCV > list[i+1].TabCV)
            {
                needSwap = true;
            }
            // TabCV相同时比较TabName
            else if (list[i].TabCV == list[i+1].TabCV)
            {
                // 使用string.Compare按字母序比较,返回值>0表示前者大于后者
                if (string.Compare(list[i].TabName, list[i+1].TabName) > 0)
                {
                    needSwap = true;
                }
            }

            if (needSwap)
            {
                // 交换元素
                Sort temp = list[i];
                list[i] = list[i+1];
                list[i+1] = temp;
                swapped = true;
            }
        }
        // 若本轮无交换,说明列表已完全有序,提前终止循环
        if (!swapped)
            break;
    }
    return list;
}

方案2:原代码快速修复

如果要保留原代码结构,可针对错误点修改:

版本1修复

将IOrderedEnumerable转为List即可支持索引访问:

// 替换原版本1中错误的代码段
var tempTempList = tempList.OrderBy(x => x.TabName).ToList();
list[i + 1] = tempTempList[1];
list[i] = tempTempList[0];

版本2修复

接收OrderBy的返回值,并修正排序条件:

// 替换原版本2中错误的代码段
tempList = tempList.OrderBy(x => x.TabName).ToList();
list[i + 1] = tempList[1];
list[i] = tempList[0];

测试用例转换示例

将输入字符串转为Sort列表的工具代码:

static List<Sort> ParseInput(string input)
{
    return input.Split(' ')
                .Select(numStr => new Sort 
                { 
                    TabName = numStr, 
                    TabCV = int.Parse(numStr) 
                })
                .ToList();
}

// 使用示例
string testCase1 = "103 123 4444 99 2000";
List<Sort> list1 = ParseInput(testCase1);
BubbleSort(list1);

string testCase2 = "2000 10003 1234000 44444444 9999 11 11 22 123";
List<Sort> list2 = ParseInput(testCase2);
BubbleSort(list2);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:40:23