通过用户输入编写动态 IF 函数

Writing Dynamic IF Functions by user entry

我对编码 (C#) 还是很陌生,我正在根据用户标准(他们想要搜索的字符串)编写一个文件 reader。

我的程序做了什么:

用户可以输入搜索一个字符串/多个字符串(具有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 函数中的 "condition"。

我是不是用错了方法?实现这一目标的最佳方式是什么?

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

所以,首先,阅读用户输入的行。如果您的典型预期输入类似于 (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 项)视为自己的 "search" 并使用 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 returns 一个布尔值,然后将该布尔值传递给 bool OR string.Contains 操作的比较)

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