冒泡排序实现与WinForms文本框显示问题求助
问题修复:冒泡排序失效+文本框显示异常
一、核心错误分析
1. 冒泡排序的问题
- 类型不兼容:你定义的
Bubbelsortera方法接收int[]参数,但实际要排序的是List<Salesperson>,两者完全不匹配,根本无法对销售人员列表生效。 - 语法+递归错误:内层循环
j < Salespeople.Length - (1;存在括号不匹配的语法错误;方法内部直接递归调用自己,会导致无限递归,编译都无法通过。 - 排序逻辑错误:外层循环条件
i < Salespeople.Length - (1 + i)会导致循环提前终止,内层循环也没有正确排除已经排好序的元素。 - 未针对销量排序:排序逻辑只操作int数组,完全没有用到
Salesperson对象的Sold字段,等于没有对列表中的销售人员按销量排序。
2. 文本框显示的问题
- 循环覆盖内容:在
foreach循环内部每次执行tbxResultat.Text = "标题...",会清空之前的内容,最终只保留最后一次循环的结果。 - 仅处理等级1条目:代码里只判断了
sp.Sold < 50的情况,其他等级(2/3/4)的销售人员完全没有添加到文本框中。 - 统计时机错误:统计信息应该在遍历完所有销售人员、按等级分组后统一显示,而不是在循环内每次输出,导致重复混乱。
二、修复后的完整代码
1. 修正冒泡排序方法(针对List<Salesperson>)
// 按销量从小到大排序Salesperson列表的冒泡排序方法 void Bubbelsortera(List<Salesperson> salespeople) { int n = salespeople.Count; for (int i = 0; i < n - 1; i++) { // 内层循环:每次把最大的元素"冒泡"到末尾,减去i跳过已排好的元素 for (int j = 0; j < n - 1 - i; j++) { if (salespeople[j].Sold > salespeople[j + 1].Sold) { // 交换两个销售人员对象的位置 Salesperson temp = salespeople[j]; salespeople[j] = salespeople[j + 1]; salespeople[j + 1] = temp; } } } }
2. 修正排序按钮点击事件
public void lblSortera_Click(object sender, EventArgs e) { // 先对销售人员列表做冒泡排序 Bubbelsortera(Salespeople); // 统计各等级人数+按等级分组存储 int niva1Count = 0, niva2Count = 0, niva3Count = 0, niva4Count = 0; List<Salesperson> niva1List = new List<Salesperson>(); List<Salesperson> niva2List = new List<Salesperson>(); List<Salesperson> niva3List = new List<Salesperson>(); List<Salesperson> niva4List = new List<Salesperson>(); foreach (Salesperson sp in Salespeople) { int level = sp.Niva(); // 复用类中已有的Niva()方法,避免重复逻辑 switch (level) { case 1: niva1Count++; niva1List.Add(sp); break; case 2: niva2Count++; niva2List.Add(sp); break; case 3: niva3Count++; niva3List.Add(sp); break; case 4: niva4Count++; niva4List.Add(sp); break; } } // 构建文本框内容,先清空原有内容 tbxResultat.Clear(); string header = "Name Ssn District Pcs\r\n"; // 按等级输出:标题→销售人员→统计信息 if (niva1Count > 0) { tbxResultat.AppendText(header); foreach (var sp in niva1List) { tbxResultat.AppendText($"{sp.Namn,-12} {sp.PersNummer,-15} {sp.Distrikt,-12} {sp.Sold}\r\n"); } tbxResultat.AppendText($"{niva1Count} sellers have reached level 1: under 50 articles\r\n\r\n"); } if (niva2Count > 0) { tbxResultat.AppendText(header); foreach (var sp in niva2List) { tbxResultat.AppendText($"{sp.Namn,-12} {sp.PersNummer,-15} {sp.Distrikt,-12} {sp.Sold}\r\n"); } tbxResultat.AppendText($"{niva2Count} sellers have reached level 2: 50-99 articles\r\n\r\n"); } if (niva3Count > 0) { tbxResultat.AppendText(header); foreach (var sp in niva3List) { tbxResultat.AppendText($"{sp.Namn,-12} {sp.PersNummer,-15} {sp.Distrikt,-12} {sp.Sold}\r\n"); } tbxResultat.AppendText($"{niva3Count} sellers have reached level 3: 100-199 articles\r\n\r\n"); } if (niva4Count > 0) { tbxResultat.AppendText(header); foreach (var sp in niva4List) { tbxResultat.AppendText($"{sp.Namn,-12} {sp.PersNummer,-15} {sp.Distrikt,-12} {sp.Sold}\r\n"); } tbxResultat.AppendText($"{niva4Count} sellers have reached level 4: over 199 articles\r\n"); } }
3. 可选:优化Salesperson的ToString方法(让输出对齐更整齐)
public override string ToString() { return $"{Namn,-12} {PersNummer,-15} {Distrikt,-12} {Sold}"; }
三、关键修复说明
- 冒泡排序直接操作
List<Salesperson>,比较每个对象的Sold属性,实现按销量排序。 - 按等级分组存储销售人员,遍历完所有数据后再统一输出,避免内容被覆盖。
- 先清空文本框再构建内容,确保所有等级的条目都能显示。
- 复用
Salesperson类中的Niva()方法,减少重复代码,避免逻辑不一致。 - 使用固定宽度格式化字符串(
-12表示左对齐占12个字符),让输出和示例格式完全一致。
内容的提问来源于stack exchange,提问作者Isabelle B
相关产品推荐
相关产品推荐

