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

C#实现按销售商品数对销售人员冒泡排序及代码优化咨询

一、构建排序数组并实现冒泡排序的解决方案

你的核心问题是录入的销售人员数据无法传递到Main方法,且当前冒泡排序仅处理int数组,无法关联具体销售人员信息。更合理的做法是直接对SalesPerson对象列表按销售商品数排序,步骤如下:

  1. 修改InputSalesPersons方法,返回录入的销售人员列表
    将原方法返回类型从void改为List<SalesPerson>,让Main方法能获取到所有录入数据:

    public static List<SalesPerson> InputSalesPersons()
    {
        Console.Write("Hur många säljare vill du mata in? ");
        int count = Convert.ToInt32(Console.ReadLine());
    
        var sellers = new List<SalesPerson>();
        for (int i = 0; i < count; i++)
        {
            SalesPerson s = RegisterPerson(i);
            sellers.Add(s);
        }
        return sellers;
    }
    
  2. 修改冒泡排序方法,支持对SalesPerson列表排序
    不需要单独构建int数组,直接比较每个SalesPerson的items属性,排序时交换整个对象,保留完整人员信息:

    public static void BubbleSort(List<SalesPerson> sellers)
    {
        int n = sellers.Count;
        for (int i = 0; i < n - 1; i++)
        {
            bool swapped = false; // 优化:标记是否发生交换,提前退出循环
            for (int j = 0; j < n - i - 1; j++)
            {
                // 按销售商品数升序排序,改为<则实现降序
                if (sellers[j].items > sellers[j + 1].items)
                {
                    SalesPerson temp = sellers[j];
                    sellers[j] = sellers[j + 1];
                    sellers[j + 1] = temp;
                    swapped = true;
                }
            }
            if (!swapped) break; // 本轮无交换,说明已完全有序,提前结束
        }
    }
    
  3. 在Main方法中调用并输出排序结果
    完成数据录入、排序后,添加输出逻辑展示结果:

    static void Main(string[] args)
    {
        var sellers = SalesPerson.InputSalesPersons();
        BubbleSort(sellers);
        Console.WriteLine("\n按销售商品数排序后的销售人员信息:");
        foreach (var seller in sellers)
        {
            Console.WriteLine($"姓名:{seller.name},编号:{seller.number},区域:{seller.district},销售数:{seller.items},等级:{seller.Level}");
        }
    }
    

如果确实需要单独构建销售数量的int数组(仅用于数值排序,不关联人员),可以从列表中提取:

int[] itemsArray = sellers.Select(s => s.items).ToArray();
BubbleSort(itemsArray); // 使用你原有的int数组排序方法

但这种方式无法对应具体销售人员,仅适合单独统计数值场景。


二、代码改进建议

1. 字段封装与命名规范

遵循C#帕斯卡命名法(类、属性、方法名首字母大写),将公共字段改为私有,通过属性暴露,符合面向对象封装原则:

private string _name;
private ulong _number;
private string _district;
private int _items;

public string Name { get => _name; set => _name = value; }
public ulong Number { get => _number; set => _number = value; }
public string District { get => _district; set => _district = value; }
public int Items { get => _items; set => _items = value; }

2. 输入合法性验证

当前使用Parse方法,用户输入非数值会直接崩溃,改用TryParse做验证并提示用户重新输入:

// 示例:验证销售数量输入
int items;
while (true)
{
    Console.Write("Ange antal sålda artiklar för säljare {0}: ", i);
    if (int.TryParse(Console.ReadLine(), out items) && items >= 0)
    {
        break;
    }
    Console.WriteLine("输入无效,请输入非负整数!");
}

同样逻辑可应用到人员数量、编号的输入环节。

3. 方法职责与结构优化

  • 让Main方法仅作为程序入口,负责调用核心逻辑,不包含业务细节;
  • 单独添加PrintSalesPersons方法负责输出,拆分职责让代码更清晰:
    public static void PrintSalesPersons(List<SalesPerson> sellers)
    {
        Console.WriteLine("\n销售人员信息:");
        foreach (var seller in sellers)
        {
            Console.WriteLine($"姓名:{seller.Name},编号:{seller.Number},区域:{seller.District},销售数:{seller.Items},等级:{seller.Level}");
        }
    }
    

4. 等级计算的可读性优化

将等级阈值定义为常量,便于后续维护和修改:

private const int Level1Max = 49;
private const int Level2Max = 99;
private const int Level3Max = 199;

public int Level
{
    get
    {
        if (Items <= Level1Max) return 1;
        if (Items <= Level2Max) return 2;
        if (Items <= Level3Max) return 3;
        return 4;
    }
}

5. 其他细节

  • 人员编号使用ulong合理,但可添加长度验证(确保是10位);
  • 冒泡排序的swapped标志优化能减少不必要的循环,提升小数据量下的效率;
  • 保持控制台提示语的本地化风格(你的代码用瑞典语,无需修改)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:40:54