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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:45:04