C#实现按销售商品数对销售人员冒泡排序及代码优化咨询
一、构建排序数组并实现冒泡排序的解决方案
你的核心问题是录入的销售人员数据无法传递到Main方法,且当前冒泡排序仅处理int数组,无法关联具体销售人员信息。更合理的做法是直接对SalesPerson对象列表按销售商品数排序,步骤如下:
修改
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; }修改冒泡排序方法,支持对
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; // 本轮无交换,说明已完全有序,提前结束 } }在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
相关产品推荐
相关产品推荐

