假设您有一个function tree,其中有多个节点,这些节点可以是运算符节点(一元或二进制运算符),也可以是终端节点(常量)。

我刚开始将手指放在键盘上,但遇到了一个小障碍。我创建了Node接口,Operator:NodeBinaryOperator:OperatorUnaryOperator:OperatorTerminal:Node构造。

这就是我的问题。我现在是否为每个可预见的函数创建一个单独的类?是否创建SinOperator:UnaryOperatorCosOperator:UnaryOperatorAddOperator:BinaryOperator等?如果包括正向和反向三角函数及其双曲线表亲,则可以考虑很多因素。

另外,我可以将其留给Binary和Unary运算符,然后传递一个委托,该委托根据其子节点评估该节点的值。

var sinOperator = new UnaryOperator(
                    childNode,
                    delegate()
                    {
                      return Math.Sin(childNode.GetValue());
                    });


但是,实际上并没有什么阻止我将各种疯狂的东西放入委托人中,从而打破了仅仅作为操作员的整个概念。

注意:是的,我意识到只有几个运算符(+-* / ^√),并且sin / cos实际上是函数...但是出于本项目的目的,我们可以假定它是一个运算符

那么,您将如何在C#中构建此结构?

最佳答案

您为什么不看看Linq.Expressions的工作原理?它是C#中(以及整个.NET语言)的现有模型。

在这里,您具有使用Linq.Expressions实现的nice example of a Derivation program(您可以检查它如何处理运算符,正弦,余弦等。)

08-27 09:43