C#控制台多级菜单实现多选交互的药品续方问询功能开发求助
控制台多级菜单+多选交互C#实现方案
核心实现逻辑
- 放弃单分支switch跳转逻辑,采用字典存储选项编码与药物的映射关系,支持批量匹配多选结果
- 对用户输入做格式化处理,自动兼容多选项的分隔符、空格、大小写等输入误差
- 单独标记特殊选项O1,选中后触发自定义输入逻辑
- 所有交互节点增加输入校验,避免非法输入导致程序崩溃
可直接复用的代码示例
using System; using System.Collections.Generic; using System.Linq; namespace PrescriptionConsoleApp { class Program { // 全局药品映射字典,后续新增选项直接修改此处即可 private static readonly Dictionary<string, string> DrugMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) { {"H1", "Atenelol"}, {"H2", "Lisinopril"}, {"D1", "Metformin"}, {"D2", "Gabapentin"}, {"T1", "Synthroid"}, {"T2", "Levothyroxine"}, {"O1", ""} }; static void Main(string[] args) { // 主菜单循环 while (true) { Console.Clear(); Console.WriteLine("=== 主菜单 ==="); Console.WriteLine("1. 处方续方申请"); Console.WriteLine("2. 退出程序"); Console.Write("请输入选项编号:"); var mainChoice = Console.ReadLine()?.Trim(); switch (mainChoice) { case "1": PrescriptionSubMenu(); break; case "2": Console.WriteLine("程序退出"); return; default: Console.WriteLine("输入无效,请按任意键返回主菜单"); Console.ReadKey(); break; } } } // 处方续方子菜单 private static void PrescriptionSubMenu() { Console.Clear(); List<string> selectedDrugs = new List<string>(); // 第一步:展示药品选项 Console.WriteLine("您今日需要开具哪些药物?"); Console.WriteLine("血压类(BP):H1. Atenelol、H2. Lisinopril"); Console.WriteLine("糖尿病类(Diabetes):D1. Metformin、D2. Gabapentin"); Console.WriteLine("甲状腺类(Thyroid):T1. Synthroid、T2. Levothyroxine"); Console.WriteLine("其他类(Other):O1. 自定义药物"); Console.Write("请输入选择的选项编码,多个选项用逗号分隔(例:H2, D1, T1, O1):"); // 解析多选输入 while (true) { var input = Console.ReadLine()?.Trim(); if (string.IsNullOrEmpty(input)) { Console.Write("输入不能为空,请重新输入:"); continue; } var codes = input.Split(',').Select(c => c.Trim()).Where(c => !string.IsNullOrEmpty(c)).ToList(); bool hasInvalidCode = false; selectedDrugs.Clear(); foreach (var code in codes) { if (!DrugMap.TryGetValue(code, out var drugName)) { Console.Write($"不存在的选项编码:{code},请重新输入:"); hasInvalidCode = true; break; } if (code.Equals("O1", StringComparison.OrdinalIgnoreCase)) { Console.Write("请输入自定义药物名称:"); var customDrug = Console.ReadLine()?.Trim(); while (string.IsNullOrEmpty(customDrug)) { Console.Write("药物名称不能为空,请重新输入:"); customDrug = Console.ReadLine()?.Trim(); } selectedDrugs.Add(customDrug); } else { selectedDrugs.Add(drugName); } } if (!hasInvalidCode) break; } // 第二步:询问是否携带药瓶 Console.Write("您今日携带药瓶了吗?请输入Y/N回复:"); var hasBottle = GetYesOrNoInput(); // 第三步:询问1年内是否开个该处方 Console.Write("我们过去1年是否为您开过这些处方?请输入Y/N回复:"); var hasPrescriptionHistory = GetYesOrNoInput(); // 输出结果 Console.WriteLine($"\n您申请续方的药物为:{string.Join("、", selectedDrugs)}"); Console.WriteLine("按任意键返回主菜单"); Console.ReadKey(); } // 统一处理Y/N输入的校验方法 private static bool GetYesOrNoInput() { while (true) { var input = Console.ReadLine()?.Trim().ToUpper(); if (input == "Y" || input == "YES") return true; if (input == "N" || input == "NO") return false; Console.Write("输入无效,请输入Y/N回复:"); } } } }
代码扩展说明
- 新增药物选项只需修改
DrugMap字典,无需调整后续业务逻辑 - 多级菜单可参考主菜单的嵌套结构扩展,新增子菜单只需新增对应方法即可
- 可根据业务需求新增多选校验规则,比如最多可选数量、必选选项限制等
内容的提问来源于stack exchange,提问作者Corey
相关产品推荐
相关产品推荐

