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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:45:37