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

C#中Student数组排序交换后对象异常重复问题求助

问题分析与解决

核心问题

你遇到的排序后数据异常(Rina消失、出现重复Cina),根源在两处:

  1. 排序逻辑不完整:当前代码只执行了一轮相邻元素的比较交换,这只是冒泡排序的单个步骤,无法完成全局有序的排序。
  2. 数组越界风险:循环条件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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:44:56