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,这会导致列表里全是排序过程中的中间值,而不是最终排序好的完整结果。正确的做法是等整个排序完成后,遍历最终的数组一次性添加。
额外优化建议(避免后续踩坑)
- 数据库连接的安全处理:用
using语句包裹所有数据库相关对象(连接、命令、数据阅读器),确保资源自动释放,不会出现连接泄漏的问题。 - 整数转换的安全性:数据库里的
RemainingDept可能存在非整数值或者null,直接用int.Parse会炸锅,换成int.TryParse做验证更稳妥。 - 代码精简:直接用
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
相关产品推荐
相关产品推荐

