通过用户输入编写动态 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 并按括号分组,您可能希望将其分解为:
- 对于每个过滤单元 - 每个括号 - 您想要保存 2 条信息:被过滤的项目 (
bob
, casey
) 和运算符 (AND
)
- 这些单位对顺序敏感;
(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.Contains
和 bool OR string.Contains
的情况。
如果你有类似 bob AND josh OR casey
的东西,你可以做一个单级线性比较,你只需将它们切碎并一次一个地通过比较(bob and josh
returns 一个布尔值,然后将该布尔值传递给 bool OR string.Contains
操作的比较)
这种结构还意味着如果您的范围发生变化(意味着您将不会有一系列不断增加的 if 语句),您不太可能获得意大利面条式代码,并且您可以处理不可预测的输入并通知用户如果出了什么问题。
我对编码 (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 并按括号分组,您可能希望将其分解为:
- 对于每个过滤单元 - 每个括号 - 您想要保存 2 条信息:被过滤的项目 (
bob
,casey
) 和运算符 (AND
) - 这些单位对顺序敏感;
(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.Contains
和 bool OR string.Contains
的情况。
如果你有类似 bob AND josh OR casey
的东西,你可以做一个单级线性比较,你只需将它们切碎并一次一个地通过比较(bob and josh
returns 一个布尔值,然后将该布尔值传递给 bool OR string.Contains
操作的比较)
这种结构还意味着如果您的范围发生变化(意味着您将不会有一系列不断增加的 if 语句),您不太可能获得意大利面条式代码,并且您可以处理不可预测的输入并通知用户如果出了什么问题。