Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建一个规则字符串,该规则字符串说明是否允许另一个字符串返回布尔值_C# - Fatal编程技术网

C# 如何创建一个规则字符串,该规则字符串说明是否允许另一个字符串返回布尔值

C# 如何创建一个规则字符串,该规则字符串说明是否允许另一个字符串返回布尔值,c#,C#,我遇到了一个有趣的问题,我已经有了两个可行的解决方案,但是其中一个非常慢,另一个非常有限。 我试图集思广益,探讨如何在尽可能灵活的同时有效地解决这个问题。我希望有人能对如何进行这件事有一些想法,因为我完全被难住了 我有一个名字,假设我有一些字符串:“a”“B”“C”“TEST”等等 然后我有另一根绳子,比如说。。。“(A或测试)而B不是“C”或沿着该线的东西 现在我需要创建一个函数,在这个函数中,我可以将第二个字符串与第一个字符串一起输入,并返回一个布尔值 因此: 挑战在于性能,我需要一些尽可能

我遇到了一个有趣的问题,我已经有了两个可行的解决方案,但是其中一个非常慢,另一个非常有限。 我试图集思广益,探讨如何在尽可能灵活的同时有效地解决这个问题。我希望有人能对如何进行这件事有一些想法,因为我完全被难住了

我有一个名字,假设我有一些字符串:“a”“B”“C”“TEST”等等

然后我有另一根绳子,比如说。。。“(A或测试)而B不是“C”或沿着该线的东西

现在我需要创建一个函数,在这个函数中,我可以将第二个字符串与第一个字符串一起输入,并返回一个布尔值

因此:


挑战在于性能,我需要一些尽可能高效的东西,因为这经常被调用

我的第一个超级便宜的简单解决方案是哈希集 做

Function(InputString, Hashset)
    return Hashset.contains(InputString)
显然,这并不能解决问题,这只是性能问题,并没有实现基本理念。然而,我需要更多的灵活性

我的第二个解决方案要复杂得多,占用了大约20%的CPU使用率。 但是它涵盖了我需要的所有案例,但是它太复杂,太昂贵了


作为旁注,我使用的是c#。

我认为这一行:
调用函数(“a”、“(a或TEST)而B不是c)”
将返回false,因为它不满足“AND B”。“ab”或“TEST B”将返回true。也许我弄错了

第一步我认为是一个简单的好的/坏的过滤器。解析表达式并将好/坏输入确定为两个哈希集。例如
(A或测试)和B而不是C
可以解析为bad=(“C”)、good=(“A”、“B”、“TEST)。很容易根据两个哈希集检查输入[假设任何不在任一哈希集中的输入都被隐式禁止]

如果您多次使用规则字符串,我会添加一个哈希来解析查找,并重新使用解析,而不是每次都重新计算

当您必须处理所需的对时,它会变得更加困难。例如
(A或TEST)和B而不是C
对我来说意味着
ab
testb
是有效的,而不是“A”、“TEST”或“C”或“D”。如果您扩展解析过程以实际计算逻辑,“good/bad”集将成为有效的输入字符串,例如bad=((“C”)、good=(“ab”)、”测试B”)


对于
“(A和B)或(C和D)”
“A B”
“C D”
是有效的,但除此之外什么都没有。

“我需要尽可能高效的东西”-我怀疑这是否真的是这样。在某个时候,我确信你会停下来说“我不需要进一步优化它,它满足了我的需要。”。“那么,您是否有具体的性能要求,以及测试任何候选代码的基准?分享这将是有益的。我希望有一种通用的方法来编写一些东西,将规则字符串转换成某种谓词,并缓存这些谓词,这样您就不需要多次进行规则解析。“我的第一个超级廉价的简单解决方案是哈希集”,因此,第二个参数不必是字符串?@JonSkeet-Well,这是我在游戏中一帧可能调用数千次的东西,我需要保持60-120 fps的理想状态。现在我不希望总是能达到这个目标,但是,如果我能挤出更多的表现,那么我会的。没有真正的基准测试或任何atm,它只需要快速。理想情况下非常快。@41686d6564虽然它不必是字符串,但非常理想,因为规则会根据用户/玩家输入的值动态更改。所以字符串很简单,可以快速迭代以查看结果,这在一种模拟游戏中使用。你的语法是什么样子的。我发现
(A或TEST)和B在我的头脑中不难解析,特别是因为您正在检查的输入只需要一个输入(在您的示例
C
A
)。一旦用户创建规则,就考虑对规则进行分析(可能进入树)。当你想测试一个变量时,首先检查它是否是一个可接受的标记,然后遍历规则树看看发生了什么对不起,我将代码示例改为“a或测试或B而不是C”。我确实犯了一个错误,哈哈,对不起。是的,现在这似乎是最好的途径,解析规则字符串,从规则字符串创建一个允许和不允许的哈希集,并检查它们。
Function(InputString, Hashset)
    return Hashset.contains(InputString)