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

冒泡排序实现与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}";
}

三、关键修复说明

  1. 冒泡排序直接操作List<Salesperson>,比较每个对象的Sold属性,实现按销量排序。
  2. 按等级分组存储销售人员,遍历完所有数据后再统一输出,避免内容被覆盖。
  3. 先清空文本框再构建内容,确保所有等级的条目都能显示。
  4. 复用Salesperson类中的Niva()方法,减少重复代码,避免逻辑不一致。
  5. 使用固定宽度格式化字符串(-12表示左对齐占12个字符),让输出和示例格式完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:37:09