По сути, у меня есть опрос, который показан, и люди отвечают на вопросы во многом как тест, и есть разные пути, пока это довольно просто, но я хотел сделать его более динамичным, чтобы у меня было общее правило для теста со всеми путями, чтобы упростить работу оценщику в настоящее время. просто разрешите И, и каждое ИЛИ станет еще одним Правилом в наборе,
QuestionID, затем я формирую кучу правил И вот так
<rule id = "1">
<true>
<question ID=123>
<question ID=124>
</true>
<false>
<question ID=127>
<question ID=128>
</false>
</rule>
<rule id = "2"><true>
<question ID=123>
<question ID=125>
</true>
<false>
<question ID=127>
</false>
</rule>
это правило 1 гласит, что если на вопросы 123 и 124 даны верные ответы, а на вопросы 127, 128 - ложные, они проходят. ИЛИ (правило 2): если 123 и 125 истинны, а 127 - ложно, они также проходят. Это становится утомительным, если есть много комбинаций, поэтому я хочу реализовать OR в логике, я просто не уверен, какой лучший подход для этой проблемы.
Я думаю, что механизм правил слишком сложен, должен быть более простой способ, возможно, построить график, как в LINQ, а затем оценить, проходят ли они,
Благодарность!
- не дипломированный специалист.





Это не должно быть сложно: вы уже прошли большую часть пути, поскольку ваши элементы и эффективно реализуют правило типа AND. Я бы представил элемент, который может содержать элементы и.
В вашем случае вы могли бы иметь:
Вы должны реализовать метод Evaluate для каждого из них следующим образом:
Эта иерархия классов реализует простое абстрактное синтаксическое дерево (AST). LINQ в форме класса System.Expressions.Expression делает примерно то же самое, но полезно написать свой собственный, если не очевидно, как все сочетается друг с другом.
Я не уверен, что полностью понимаю проблему, которую вы пытаетесь решить, но вы можете использовать простой XPath для получения идентификатора:
Это даст вам все "истинные" идентификаторы, где идентификатор правила = 1: / rule [@ id = "1"] / true // @ ID
То же, что и выше, только дает вам ложные идентификаторы: / rule [@ id = "1"] / false // @ ID
Наконец, ссылка на введение в XPath в .NET. http://www.developer.com/xml/article.php/3383961
Удачи
Я бы посоветовал дать ответы на вопросы, а не использовать true и false для группировки вопросов. Я думаю, что это упрощает чтение XML, что является спорным вопросом. Что не подлежит обсуждению, так это то, что он позволяет оценивать элемент question независимо, то есть без какого-либо знания контекста, в котором вы пытаетесь его оценить. Это упрощает код.
Я бы также взял страницу из XML-схемы и реализовал вашу логику OR как элемент choice. Элемент choice истинен, если любой из его дочерних элементов истинен. Вы можете, конечно, вложить их:
<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 GetProvidedAnswer(int questionID)bool IsQuestionCorrect(XmlElement question)bool IsChoiceCorrect(XmlElement choice)bool IsRuleSatisfied(XmlElement rule)Структура XML упрощает реализацию этих методов:
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;
}
Возможно, стоит добавить List<XmlElement> в параметры методов IsFooCorrect. (Если механизм правил находится в классе, вы можете сделать его полем класса.) Сделайте так, чтобы все методы добавляли текущий элемент в список, если ответ неправильный. Затем вы можете изучить содержимое этого списка, чтобы точно узнать, почему правило не сработало.
Если вы используете правильный механизм правил, поддерживающий логический вывод, он будет более эффективным и расширяемым.
Взгляните на http://www.flexrule.com, который представляет собой гибкий, расширяемый механизм правил, поддерживающий три типа правил. Процедурные правила, правила вывода и правила потока могут быть выведены из вашего приложения и выполняться с использованием этой структуры.
Вы могли бы немного подробнее рассказать на каком-нибудь примере кода.