0

我对编码(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 函数中的“条件”。

我会以错误的方式解决这个问题吗?实现这一目标的最佳方法是什么?

4

1 回答 1

0

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

因此,首先,阅读用户输入的行。如果您的典型预期输入类似于,(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 语句,例如

    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.Contains和的情况bool OR string.Contains

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

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

于 2017-10-24T16:05:32.747 回答