冒泡排序实现TabCV排序+TabName字母序时遇IOrderedEnumerable索引错误求助
自定义多条件冒泡排序问题修复方案
问题场景
需实现对Sort类(包含string类型TabName、int类型TabCV)列表的排序规则:
- 优先按
TabCV升序排列 - 当
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错误原因
OrderBy是非原地排序,它不会修改原集合,而是返回一个新的排序后的序列。调用tempList.OrderBy(...)但未接收返回值,原tempList完全没有变化。- 排序条件错误:需求是按
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
相关产品推荐
相关产品推荐

