如何重构这些 switch case 以处理用户在自然语言中的选择?

2024-05-02

我正在编写几个嵌套的 switch 语句,在某些地方有很多情况。

我试图找出一种方法来创建一个案例列表,然后在以后的 switch 语句中引用。

有没有办法做到这一点?

它肯定会清理我的代码。

例如,我有四个单独的案例来回答“是”。

我正在寻找一种方法将这四种情况存储在变量中,并在每次我想在开关中使用它们时调用该变量。

Console.Write("\nWere you feeling exhausted? ");
response = Console.ReadLine().ToLower();
Console.Clear();
switch (response)
{
    case "yes":
    case "y":
    case "yep":
    case "yeah":
        {
            goto ThreeTwo;
        }
    case "no":
    case "n":
    case "nope":
    case "nah":

一个很好的干净方法是首先声明一个enum来表示答案值。需要“是”、“否”and“未定义”(后者代表既不是“是”也不是“否”的答案):

public enum YesOrNo
{
    Undefined,
    Yes,
    No
}

然后您可以将是/否检测逻辑包装在一个类中。有很多方法可以做到这一点;这是一个简单的(您可以使用字典来代替,但对于如此少量的字符串来说,这并不是真正必要的,我试图使其尽可能简单):

public static class YesOrNoDetector
{
    static readonly string[] _yesAnswers = { "yes", "y", "yep", "yeah", "affirmative" };
    static readonly string[] _noAnswers  = { "no",  "n", "nah", "nope", "negative"    };

    public static YesOrNo Detect(string answer)
    {
        if (_yesAnswers.Contains(answer.ToLower()))
            return YesOrNo.Yes;

        if (_noAnswers.Contains(answer.ToLower()))
            return YesOrNo.No;

        return YesOrNo.Undefined;
    }
}

(注意它如何通过在比较之前将字符串转换为小写来处理大写答案。)

那么你原来的代码就变成了这样:

switch (YesOrNoDetector.Detect(response))
{
    case YesOrNo.Yes:
    {
        goto ThreeTwo;  // Please get rid of this goto!
    }

    case YesOrNo.No:
    {
        // Handle "No".
        break;
    }

    case YesOrNo.Undefined:
    {
        // Handle incorrect answer.
        break;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重构这些 switch case 以处理用户在自然语言中的选择? 的相关文章

随机推荐

  • 将 KB/MB/GB 等字符串解析为数值

    为了不发明自行车 我想知道是否有任何库能够将大小字符串 MB KB TB MiB KiB 等 的各种表示形式解析为基于数字字节的值 ActiveState Receipes 有一个示例here http code activestate c
  • 二维数组列表

    我听说过使用这样的二维数组 String strArr 但是有什么方法可以用列表来做到这一点吗 也许是这样的 ArrayList
  • 如何将指针传递给函数并在函数 C++ 中动态分配内存

    我试图声明一个指针并将该指针传递给分配内存的函数 这是一个最小的例子 include
  • iOS SDK - 在蒙版图像上添加阴影

    如何在上面添加阴影UIImageView哪个有蒙版图像 我不是指矩形阴影 我也想对阴影应用相同的遮罩效果 给 UIImageView 提供阴影效果尝试下面的代码 1 import
  • 在 python 中返回 self [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表对象的类 我有很多方法可以修改这个对象状态 没有明显的返回或显然没有任何返回 在 C 中 我会将所有这些方法声明为void
  • 如何在jpanel上延迟显示图片?

    这是我遇到问题的代码部分 我应该每 5 秒显示一次图片 但它不起作用 我希望你能帮忙 谢谢 编辑 5秒后所有图片一起显示 JButton btnGenerateNumber new JButton Generate Number btnGe
  • AWS Lambda - 在区域之间自动复制 EC2 快照?

    我想创建一个 Lambda 函数 python 它将自动将已创建的快照复制到另一个区域 我已联系 AWS Support 他们只向我发送了用于 RDS 数据库的 GitHub 脚本 没有 EC2 快照复制脚本 任何帮助都会很棒 谢谢 是的
  • 使用自定义元素类在 Python 中解析 xml

    我想使用 Python 的 xml etree ElementTree 模块解析 xml 文档 但是 我希望生成的树对象中的所有元素都具有我定义的一些类方法 这建议创建我自己的 Python 元素类的子类 但我无法告诉解析器在解析时使用我自
  • 如何从 Emacs 中运行 Cygwin Bash Shell?

    我在 Windows 上运行 GNU Emacs 因此输入 M x shell 启动 Windows 命令行 DOS shell 但是 我希望能够从 Emacs 中运行 Cygwin Bash Shell 或任何其他非 Windows sh
  • android studio 中 xml 文件的设计预览无法“打开”

    我在制作一个 Android 项目时遇到了一个问题 更新 android studio 后 我的 xml 文件之一设计预览将无法打开 我收到 2 个错误 我已经寻找了解决方案 并且已经尝试了很多我在网上找到的东西 但都没有改变这种情况 第一
  • 从 Rcpp C++ 函数获取 r 函数参数

    我在 R 端定义了一个函数 如下所示 foo lt function arg1 arg2 arg3 以及使用 Rcpp 的 C 函数 该函数获取全局环境并实例化 R 函数以从该函数执行它 这是代码 namespace Rcpp void m
  • 使用 javascript 获取选择标签的名称

    我在任何地方都没有找到这个问题 所以我将其发布在这里 我有一堆选择标签 部分使用 VBScript 命名 我希望能够获取从 javascript 中的 onchange 事件调用的选择标签的名称 这是代码
  • 向项目添加资源的设计

    我有课Project Resource and File where A Project包含列表资源 Each Resource包含以下列表Files特定类型的 这被映射到 XML
  • 在基于 RESTful 的应用程序中管理状态

    我们正在评估用于基于 Web 的应用程序的技术 一些建议是采用基于 RESTful 的服务方法 技术堆栈 1 春天 2 Apache CXF JAX RS 我的问题是 1 如何在请求之间管理状态 例如 用户已经过身份验证 现在他正在发出一系
  • Python 3:如何更改GDAL中的图像数据?

    我有一个 GeoTIFF 图像 其中包含颜色表和带有 8 位表键的单个栅格带 并且使用 LZW 压缩 我加载该图像gdal Open https gdal org python osgeo gdal module html 我还有一个包含
  • shell进程的并行执行

    有没有一个工具可以在 Windows 批处理文件中并行执行多个进程 我发现了一些有趣的 Linux 工具 parallel http mi eng cam ac uk er258 code parallel html and PPSS ht
  • JS中的递归排序

    在一次采访中 我被要求编写一个程序 算法来使用递归对数字数组进行排序 虽然我含糊地回答了它 但我尝试并想出了以下代码 您可以使用以下JSFiddle https jsfiddle net RajeshDixit 2u9mLegv 1 链接来
  • Twitter 个人资料图像 API 已弃用

    我正在使用 Twitter API 版本 1 并将其替换为 v1 1 然后我在 1 1 版本上找不到 users profile image screen name API https api twitter com 1 users pro
  • 安卓中的界面

    我在 android 中编写了一个包含图像和视频视图的表格布局 我想在 android 中编写一个界面 它将在不干扰我的布局的情况下获取图像以及数据和视频 该数据可以采用任何形式 来自任何来源 并且必须通过接口提供给布局 我应该如何为我在a
  • 如何重构这些 switch case 以处理用户在自然语言中的选择?

    我正在编写几个嵌套的 switch 语句 在某些地方有很多情况 我试图找出一种方法来创建一个案例列表 然后在以后的 switch 语句中引用 有没有办法做到这一点 它肯定会清理我的代码 例如 我有四个单独的案例来回答 是 我正在寻找一种方法