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

C#客户债务排序程序出现数组越界错误的解决方法

解决“Index was outside the bounds of the array”错误&优化你的冒泡排序实现

我一眼就揪出问题所在了——你的冒泡排序内层循环的迭代方向写反了!让我给你一步步拆解:

错误根源:内层循环迭代方向完全搞反

你写的内层循环是:

for (int j=A.Length-1; j>i; j++)

这里j从数组最后一个有效索引开始,然后递增(j++),下一次循环j就会变成A.Length,而数组的最大有效索引是A.Length-1,这时候访问B[j]或者B[j-1]直接就触发了索引越界错误。

冒泡排序的内层循环应该是递减迭代(j--),这样j会从末尾逐步往i+1的方向移动,绝对不会超出数组范围。

第二个坑:错误的元素添加时机

你在每次交换元素的时候就把tmp塞进listBox3,这会导致列表里全是排序过程中的中间值,而不是最终排序好的完整结果。正确的做法是等整个排序完成后,遍历最终的数组一次性添加。

额外优化建议(避免后续踩坑)

  1. 数据库连接的安全处理:用using语句包裹所有数据库相关对象(连接、命令、数据阅读器),确保资源自动释放,不会出现连接泄漏的问题。
  2. 整数转换的安全性:数据库里的RemainingDept可能存在非整数值或者null,直接用int.Parse会炸锅,换成int.TryParse做验证更稳妥。
  3. 代码精简:直接用List<int>存储债务金额,省去多余的数组转换步骤。

修正后的完整代码

private void button2_Click(object sender, EventArgs e)
{
    listBox3.Items.Clear();
    // 使用using确保数据库对象自动释放
    using (OleDbCommand cmd = new OleDbCommand("SELECT RemainingDept FROM Dept_Tbl", conn))
    {
        try
        {
            conn.Open();
            using (OleDbDataReader dr = cmd.ExecuteReader())
            {
                List<int> debtList = new List<int>();
                while (dr.Read())
                {
                    // 安全转换整数,跳过无效值
                    if (int.TryParse(dr["RemainingDept"].ToString(), out int debt))
                    {
                        debtList.Add(debt);
                    }
                    else
                    {
                        MessageBox.Show("发现无效的债务金额,已跳过该记录");
                    }
                }

                // 冒泡排序(从小到大)
                int[] sortedDebts = debtList.ToArray();
                int tmp;
                for (int i = 0; i < sortedDebts.Length; i++)
                {
                    // 内层循环改为递减迭代
                    for (int j = sortedDebts.Length - 1; j > i; j--)
                    {
                        if (sortedDebts[j - 1] > sortedDebts[j])
                        {
                            tmp = sortedDebts[j - 1];
                            sortedDebts[j - 1] = sortedDebts[j];
                            sortedDebts[j] = tmp;
                        }
                    }
                }

                // 排序完成后统一添加到列表框
                foreach (int debt in sortedDebts)
                {
                    listBox3.Items.Add(debt.ToString());
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"操作出错:{ex.Message}");
        }
        finally
        {
            // 确保连接一定会关闭
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }
    }
}

补充:如果需要从大到小排序

只需要把冒泡排序里的判断条件改成B[j - 1] < B[j]即可:

if (sortedDebts[j - 1] < sortedDebts[j])
{
    tmp = sortedDebts[j - 1];
    sortedDebts[j - 1] = sortedDebts[j];
    sortedDebts[j] = tmp;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:17:03