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

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:疫苗记录无法存储,数据重置为空

问题分析

原代码存在三个核心问题:

  1. 录入的马匹基础信息(名字、品种等)没有赋值给myHorse对象的属性,导致对象属性为空;
  2. 录入的疫苗ID和日期没有调用Horse类的AddVac方法,无法存入vaccination_records哈希表;
  3. 方法内定义了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;
}

原理讲解

  1. 对象属性赋值:创建myHorse实例后,必须将用户输入的基础信息赋值给对应的属性(比如myHorse.Name = pName),否则对象的属性会保持默认值(字符串默认null,整数默认0),导致数据丢失。
  2. 调用AddVac方法:每次录入疫苗ID和日期后,必须调用myHorse.AddVac(iD, vacDate),才能将数据存入Horse类内部的vaccination_records哈希表。原代码只获取了输入值,但没有执行存储操作,所以数据无法保留。
  3. 返回正确的对象:方法最后必须返回myHorse,否则调用AddHorse()时会得到空对象,导致后续添加到HorseList的是无效数据。

额外优化建议

  1. 替换Hashtable为泛型Dictionary:Hashtable是非泛型集合,存在装箱拆箱性能损耗,推荐使用Dictionary<string, string> vaccination_records = new Dictionary<string, string>(),类型更安全,性能更好。
  2. 输入验证:对用户输入的年份等数值类型,使用int.TryParse避免格式错误导致的程序崩溃(如上述修正代码中的处理)。
  3. 修复删除功能逻辑:原代码中删除马匹的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:10:26