C#马匹医疗程序问题:疫苗记录循环异常与数据存储失效求助
马匹医疗程序问题解决及原理讲解
问题1:输入0无法退出疫苗录入循环
问题分析
原代码的循环逻辑完全颠倒:while (iD.Equals("0")) 表示只有输入0时才进入循环,但实际需求是输入非0时录入疫苗,输入0时退出。同时内部的break判断冗余,逻辑混乱。
修正后的AddHorse方法循环部分
Console.WriteLine("Input your horse's vaccination record or enter 0 to exit."); String iD = Console.ReadLine(); // 循环条件改为:输入不是0时继续录入 while (!iD.Equals("0")) { Console.WriteLine("Input Vaccination Date"); String vacDate = Console.ReadLine(); // 调用AddVac方法存储疫苗记录(解决第二个问题的关键步骤) myHorse.AddVac(iD, vacDate); Console.WriteLine("Input your horse's vaccination record or enter 0 to exit."); iD = Console.ReadLine(); }
原理讲解
!iD.Equals("0")是取反判断:只要用户输入的不是"0",循环就会继续执行,完全符合“输入非0录入、输入0退出”的需求。- 去掉了冗余的
if (iD == "0") break;,因为当用户输入0时,循环条件不满足,会自动退出,不需要额外break。 - 字符串比较推荐用
Equals而非==,虽然C#中字符串的==已重载为值比较,但Equals在处理空值等场景下更严谨。
问题2:疫苗记录无法存储,数据重置为空
问题分析
原代码存在三个核心问题:
- 录入的马匹基础信息(名字、品种等)没有赋值给
myHorse对象的属性,导致对象属性为空; - 录入的疫苗ID和日期没有调用Horse类的
AddVac方法,无法存入vaccination_records哈希表; - 方法内定义了
Horse newHorse = null;但未使用,且未正确返回创建的myHorse对象。
完整修正后的AddHorse方法
static Horse AddHorse() { Horse myHorse = new Horse(); Console.WriteLine("Please enter your horse's common name"); String pName = Console.ReadLine(); // 将输入值赋值给myHorse的Name属性(假设Horse类有对应属性) myHorse.Name = pName; Console.WriteLine("Please enter your horse's registered name"); String regName = Console.ReadLine(); myHorse.RegisteredName = regName; Console.WriteLine("Please enter your horses breed"); String pBreed = Console.ReadLine(); myHorse.Breed = pBreed; Console.WriteLine("What year was your horse born?"); // 处理数值输入,避免格式错误崩溃 if(int.TryParse(Console.ReadLine(), out int yearOfBirth)) { myHorse.YearOfBirth = yearOfBirth; } Console.WriteLine("What is the size of your horse?"); String pSize = Console.ReadLine(); myHorse.Size = pSize; Console.WriteLine("Input your horse's vaccination record or enter 0 to exit."); String iD = Console.ReadLine(); while (!iD.Equals("0")) { Console.WriteLine("Input Vaccination Date"); String vacDate = Console.ReadLine(); // 调用Horse类的AddVac方法,将疫苗ID和日期存入哈希表 myHorse.AddVac(iD, vacDate); Console.WriteLine("Input your horse's vaccination record or enter 0 to exit."); iD = Console.ReadLine(); } // 返回创建并赋值完成的Horse对象 return myHorse; }
原理讲解
- 对象属性赋值:创建
myHorse实例后,必须将用户输入的基础信息赋值给对应的属性(比如myHorse.Name = pName),否则对象的属性会保持默认值(字符串默认null,整数默认0),导致数据丢失。 - 调用AddVac方法:每次录入疫苗ID和日期后,必须调用
myHorse.AddVac(iD, vacDate),才能将数据存入Horse类内部的vaccination_records哈希表。原代码只获取了输入值,但没有执行存储操作,所以数据无法保留。 - 返回正确的对象:方法最后必须返回
myHorse,否则调用AddHorse()时会得到空对象,导致后续添加到HorseList的是无效数据。
额外优化建议
- 替换Hashtable为泛型Dictionary:Hashtable是非泛型集合,存在装箱拆箱性能损耗,推荐使用
Dictionary<string, string> vaccination_records = new Dictionary<string, string>(),类型更安全,性能更好。 - 输入验证:对用户输入的年份等数值类型,使用
int.TryParse避免格式错误导致的程序崩溃(如上述修正代码中的处理)。 - 修复删除功能逻辑:原代码中删除马匹的
HorseList.IndexOf(myHorse)逻辑错误,myHorse是最近添加的马匹,不是用户指定的目标马匹,可替换为:
// 根据用户输入的名字查找目标马匹 Horse horseToDelete = HorseList.FirstOrDefault(h => h.Name.Equals(aResponse, StringComparison.OrdinalIgnoreCase)); if(horseToDelete != null) { HorseList.Remove(horseToDelete); Console.WriteLine($"{horseToDelete.Name} has been deleted"); } else { Console.WriteLine("Horse not found"); }
内容的提问来源于stack exchange,提问作者Gideon Adams
相关产品推荐
相关产品推荐

