C#中Student数组排序交换后对象异常重复问题求助
问题分析与解决
核心问题
你遇到的排序后数据异常(Rina消失、出现重复Cina),根源在两处:
- 排序逻辑不完整:当前代码只执行了一轮相邻元素的比较交换,这只是冒泡排序的单个步骤,无法完成全局有序的排序。
- 数组越界风险:循环条件
i < this.lastPosition会导致i+1超出数组有效索引范围——假设lastPosition是已存元素的数量,数组最大有效索引是lastPosition-1,当i等于lastPosition-1时,i+1指向未初始化的区域,操作此处会导致数据覆盖异常。
修复步骤
1. 实现完整的冒泡排序逻辑
改成双层循环,同时修正边界条件,确保所有元素完成排序:
// 完整冒泡排序实现 for (int pass = 0; pass < this.lastPosition - 1; pass++) { bool swapped = false; // 每一轮只比较到未排序的最后一个元素 for (int i = 0; i < this.lastPosition - 1 - pass; i++) { if (this.list[i].GetName().CompareTo(this.list[i+1].GetName()) > 0) { // 交换对象引用,逻辑本身无问题 Student temp = this.list[i]; this.list[i] = this.list[i+1]; this.list[i+1] = temp; swapped = true; } } // 本轮无交换说明已完全有序,提前退出 if (!swapped) break; }
2. 验证lastPosition的正确性
确保lastPosition严格等于数组中实际添加的Student对象数量。比如你有3个学生,lastPosition必须是3,若数值过大,程序会访问数组未初始化区域,导致已有数据被覆盖。
3. 更可靠的替代方案:使用内置排序方法
直接用.NET提供的Array.Sort方法,无需手动实现排序逻辑,自动处理边界和排序逻辑:
Array.Sort(this.list, 0, this.lastPosition, Comparer<Student>.Create((s1, s2) => s1.GetName().CompareTo(s2.GetName())));
补充说明
你代码里的交换逻辑是正确的——交换的是数组中存储的对象引用,不会修改对象本身内容。出现重复Cina的原因是数组越界操作覆盖了Rina的引用,而非交换逻辑错误。
内容的提问来源于stack exchange,提问作者Maya Twik
相关产品推荐
相关产品推荐

