C# 布尔逻辑规则计算器
我有一个调查,人们回答的问题很像考试, 有不同的路径,到目前为止非常简单,但我想让它更具动态性,这样我就可以有一个通用规则,用于所有路径的测试,使计算器更容易使用,目前我只允许和,每个或基本上成为集合中的另一个规则 问题ID,然后我形成了一系列的规则C# 布尔逻辑规则计算器,c#,xml,logic,boolean,rule-engine,C#,Xml,Logic,Boolean,Rule Engine,我有一个调查,人们回答的问题很像考试, 有不同的路径,到目前为止非常简单,但我想让它更具动态性,这样我就可以有一个通用规则,用于所有路径的测试,使计算器更容易使用,目前我只允许和,每个或基本上成为集合中的另一个规则 问题ID,然后我形成了一系列的规则 这条规则1说,如果问题123和124的答案为真,而127和128的答案为假,则通过。或者(规则2)是如果123和125为真,127为假,它们也通过。 如果有很多组合,这会变得单调乏味,所以我想实现或在逻辑中,我只是不确定解决这个问题的最佳方法是
这条规则1说,如果问题123和124的答案为真,而127和128的答案为假,则通过。或者(规则2)是如果123和125为真,127为假,它们也通过。
如果有很多组合,这会变得单调乏味,所以我想实现或在逻辑中,我只是不确定解决这个问题的最佳方法是什么
我认为规则引擎太复杂了,必须有一个更简单的方法,也许像LINQ一样构造一个图,然后评估它们是否通过
谢谢
--不是compsci专业。这不必复杂:您已经完成了大部分工作,因为您的and元素有效地实现了and类型规则。我将介绍一个可以容纳和元素的元素 在你的能力范围内,你可以:
- 一个规则基类,带有“public abstract bool Evaluate()”方法
- TrueRule、FalseRule和OrRule类,它们包含规则库对象的列表
- QuestionRule类,它引用特定的问题
- TrueRule:仅当包含的所有规则从Evaluate返回true时,才会返回true
- FalseRule:仅当包含的所有规则从Evaluate返回false时,才会返回true
- OrRule:如果包含的规则中至少有一个从Evaluate返回true,则返回true
- 问题规则:返回原始问题的答案
这个类层次结构实现了一个简单的抽象语法树(AST)。LINQ,以System.Expressions.Expression类的形式,做了几乎相同的事情,但是如果不清楚所有东西是如何组合在一起的,那么编写自己的LINQ是很有帮助的。我不确定我是否完全理解您试图解决的问题,但是您可以使用简单的XPath来获取ID: 这将为您提供规则ID=1的所有“true”ID: /规则[@id=“1”]/true/@id 与上面相同,只是它提供了假ID: /规则[@id=“1”]/false/@id 最后是指向.NET中XPath简介的链接
祝你好运我建议把答案放在问题上,而不是用
true
和false
来分组问题。我认为它使XML更易于阅读,这是有争议的。毋庸置疑的是,它使独立评估问题
元素成为可能,也就是说,不知道您试图评估它的上下文。这使得代码更简单
我还将从XML模式中获取一个页面,并将OR逻辑实现为选项
元素。如果某个选项的子元素为true,则该元素为true。当然,您可以嵌套它们:
<rule id="1">
<question id="123" answer="true" />
<question id="124" answer="false" />
<choice id="1">
<question id="125" answer='true' />
<choice id="2">
<question id="126" answer='false' />
<question id="127" answer='false' />
</choice>
</choice>
</rule>
在isfoocrect
方法的参数中添加列表
可能是值得的。(如果规则引擎在类中,则可以将其设置为类字段。)make`当答案错误时,所有方法都会将当前元素添加到列表中。然后,您可以检查该列表的内容,以确切了解规则失败的原因。如果您使用支持推断的适当规则引擎,它将更加高效和可扩展
看看哪一个是灵活的、可扩展的规则引擎,它支持三种类型的规则。过程、推理和规则流规则可以从应用程序中外部化,并使用此框架执行。您可以通过一些代码示例进行详细说明。
<rule id="1">
<question id="123" answer="true" />
<question id="124" answer="false" />
<choice id="1">
<question id="125" answer='true' />
<choice id="2">
<question id="126" answer='false' />
<question id="127" answer='false' />
</choice>
</choice>
</rule>
bool IsRuleSatisfied(XmlElement rule)
{
bool satisfied = true;
foreach (XmlElement child in rule.SelectNodes("*"))
{
if (child.Name == "question")
{
satisfied = satisfied && IsQuestionCorrect(child);
}
if (child.Name == "choice")
{
satisfed = satisfied && IsChoiceCorrect(child);
}
if (!satisfied)
{
return false;
}
}
return true;
}