【问题标题】:Writing Dynamic IF Functions by user entry通过用户输入编写动态 IF 函数
【发布时间】:2017-10-24 15:07:21
【问题描述】:

我对编码(C#)还是很陌生,并且正在根据用户条件(他们想要搜索的字符串)编写文件阅读器。

我的程序做了什么:

用户可以输入搜索一个字符串/多个字符串(具有 AND OR 功能) 程序解释用户条目并将字符串重新写入代码。例如

string fileLine = File.ReadAllText(line);

用户:

(hi AND no) OR yes

程序:

if((fileLine.Contains(hi) && fileLine.Contains(no)) || fileLine.Contains(yes))

我正在尝试做的事情:

将字符串与文件字符串匹配时,我使用 IF 函数:

if(fileLine.Contains(hi))
{
   //do A LOT of stuff here.
}

我的第一个想法是从输入的字符串中创建一个字符串,并替换 IF 函数中的“条件”。

我是否以错误的方式处理这件事?实现这一目标的最佳方法是什么?

【问题讨论】:

  • 通常当我想配置类似的东西时,我只是使用正则表达式而不是发明自己的语法。有了它,用户可以执行(yes)|(hi.*no)|(no.*hi) 之类的操作。诚然,它阅读起来不那么友好,但实施起来却容易得多。
  • 看起来您正在尝试做与发布 this question 的人类似的事情。

标签: c# string iif-function


【解决方案1】:

参数化输入是个好主意。看起来您确实在尝试做两件事:首先,您想确定用户的输入是什么,然后您想对该输入采取行动。

所以,首先,阅读用户输入的行。如果您的典型预期输入类似于(bob AND casey) OR josh,那么在后端实现基于正则表达式的语法应该非常简单,尽管正如 juharr 所说,那样对您来说更复杂。但是,假设用户输入是 AND/OR 并按括号分组,您可能希望将其分解如下:

  1. 对于每个过滤单元 - 每个括号 - 您希望保存 2 条信息:被过滤的项目 (bob, casey) 和运算符 (AND)
  2. 这些单位是顺序敏感的; (bob AND casey) OR josh 上的过滤不同于 bob AND (casey OR josh)。因此,您还需要更高级别的搜索顺序表示。对于(bob AND casey) OR josh,您将根据{result of bob AND casey} OR {result of josh} 确定搜索的有效性。

这些可能是对象。 :)

当您的用户输入采用标准化形式时,您需要对其进行完整性检查,并在发现无法解析的内容(未闭合的括号等)时通知用户。

在通知用户之后,您才应该执行实际的文件搜索。我建议将每个搜索单元(上面的第 2 项)视为自己的“搜索”,并为搜索运算符使用 switch statement,例如

    switch (operator) {
        case operator.AND:
            inString = fileLine.Contains(itemOne) && fileLine.Contains(itemTwo)
        case operator.OR:
            inString = fileLine.Contains(itemOne) || fileLine.Contains(itemTwo)
     }

此外,您还需要处理比较bool AND string.Containsbool OR string.Contains 的情况。

如果你有类似bob AND josh OR casey 的东西,你可以做一个一级线性比较,你只需将它们切碎并一次通过比较(bob and josh 返回一个布尔值,然后将该布尔值传递给bool OR string.Contains 操作的比较)

这种结构还意味着,如果您的范围发生变化,您就不太可能获得意大利面条式代码(也就是说,您不会有不断增加的 if 语句系列),并且您可以处理不可预知的输入并在出现问题时通知用户是错的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多