Я реализовал простое дерево решений в качестве примера в своей книге. Код доступен онлайн здесь , так что, возможно, вы могли бы использовать его в качестве вдохновения. Решение по существу представляется как класс, который имеет ссылки на ветку true
и ветку false
и содержит функцию, выполняющую тест:
class DecisionQuery : Decision {
public Decision Positive { get; set; }
public Decision Negative { get; set; }
// Primitive operation to be provided by the user
public Func<Client, bool> Test { get; set; }
public override bool Evaluate(Client client) {
// Test a client using the primitive operation
bool res = Test(client);
// Select a branch to follow
return res ? Positive.Evaluate(client) : Negative.Evaluate(client);
}
}
Здесь Decision
- это базовый класс, содержащий метод Evaluate
, а источник содержит один дополнительный производный тип, который содержит окончательное решение дерева (да / нет). Тип Client
представляет собой пример входных данных, которые вы анализируете с помощью дерева.
Чтобы создать дерево решений, вы можете написать что-то вроде:
var tree = new DecisionQuery {
Test = (client) => client.Income > 40000,
Positive = otherTree,
Negative = someOtherTree
};
Если вы просто хотите написать пять вложенных статических предложений if
, тогда, возможно, просто написать if
хорошо. Преимущество использования такого типа, как этот, состоит в том, что вы можете легко составлять деревья - например, повторно использовать часть дерева или модульную конструкцию.