如何在List中使用Func<>实现选项返回布尔值控制程序运行
解决方案:菜单选项返回布尔值控制程序运行
你当前的代码可以通过调整Func的泛型类型,让它返回布尔值来实现需求,具体修改如下:
关键修改点
- 将
Option类中的Selected属性从无返回值的Func改为Func<bool>,明确委托需要返回布尔值 - 定义选项时,让lambda直接返回对应的布尔值,而非直接给
cont赋值 - 按下Enter选择选项时,将委托的返回值赋值给
cont,并退出当前菜单选择循环
修改后的完整代码
List<Option> options; bool cont = true; // 初始设为true,让程序进入循环 do { options = new List<Option>() { new Option("Yes", () => true), // 直接返回true new Option("No", () => false) // 直接返回false }; int index = 0; Choices(options, options[index]); ConsoleKeyInfo keyinfo; do { keyinfo = Console.ReadKey(); if (keyinfo.Key == ConsoleKey.RightArrow ) { if (index + 1 < options.Count) { index++; Choices(options, options[index]); } } if (keyinfo.Key == ConsoleKey.LeftArrow) { if (index - 1 >= 0) { index--; Choices(options, options[index]); } } if (keyinfo.Key == ConsoleKey.Enter) { // 调用委托获取返回值,赋值给cont cont = options[index].Selected.Invoke(); break; // 退出内部菜单选择循环,回到外部循环判断是否继续 } } while (keyinfo.Key != ConsoleKey.X); // 保留按X退出的逻辑,此时cont不会被修改 } while (cont); Console.WriteLine("Finished"); static void Choices(List<Option> options, Option selectedOption) { Console.Clear(); foreach (Option option in options) { if (option == selectedOption) { Console.Write("[ {0} ]", option.Name); } else { Console.Write("{0}", option.Name); } } } public class Option { public string Name { get; } public Func<bool> Selected { get; set; } // 修改为Func<bool> public Option(string name, Func<bool> selected) { Name = name; Selected = selected; } }
逻辑说明
- 程序启动后进入外部
do-while循环,初始cont为true保证第一次进入菜单 - 通过左右箭头选择选项,按下Enter时调用对应选项的
Selected委托,将返回的布尔值赋值给cont - 外部循环根据
cont的值判断是否继续显示菜单:选中Yes则继续,选中No则退出循环,打印"Finished" - 保留了按X退出菜单的逻辑,此时
cont不会被修改,外部循环会根据之前的cont值判断是否继续
内容的提问来源于stack exchange,提问作者Tonas
相关产品推荐
相关产品推荐

