C# 如何以编程方式将数学表达式转换为因子和?

C# 如何以编程方式将数学表达式转换为因子和?,c#,math,mathematical-optimization,abstract-syntax-tree,C#,Math,Mathematical Optimization,Abstract Syntax Tree,我正在处理一个棘手的传统计算系统 它太挑剔了,你不能只告诉它计算a+b*c。相反,您需要将其发送为: { a } { b, c } 具体地说,在C#中,计算是一系列因子的总和,如下所示: var calculationRequest = new List<string[]> { new [] { "a" }, new [] { "b", "c" }, }; var result = calculator.Calculate(calculationRequest

我正在处理一个棘手的传统计算系统

它太挑剔了,你不能只告诉它计算
a+b*c
。相反,您需要将其发送为:

{ a }
{ b, c }
具体地说,在C#中,计算是一系列因子的总和,如下所示:

var calculationRequest = new List<string[]> 
{ 
    new [] { "a" },
    new [] { "b", "c" },
};

var result = calculator.Calculate(calculationRequest);
SymbolicExpression.Parse("a*(b+c)").Expand().Summands().Select(x => x.Factors());
a+(b/c)
将变成

{ a }
{ -b }
{ a }
{ b, /c }

我找到了使用Math.NET符号的最短方法

执行此操作的关键语法如下所示:

var calculationRequest = new List<string[]> 
{ 
    new [] { "a" },
    new [] { "b", "c" },
};

var result = calculator.Calculate(calculationRequest);
SymbolicExpression.Parse("a*(b+c)").Expand().Summands().Select(x => x.Factors());
在其中,我展开表达式,然后得到求和。对于每个求和,我得到了因子

为了更好地说明它,请考虑下面的表达式:

a * (b + c* -d)
将使用以下代码返回系数之和:

var expression = "a*(b+c*-d)";
var sumsOfFactors = SymbolicExpression.Parse(expression)
    .Expand()
    .Summands()
    .Select(x => x.Factors());

var factorsStr = sumsOfFactors.Select(x => string.Join("\t", x));
var sumOfFactorsStr = string.Join("\n", factorsStr);
Console.WriteLine(sumOfFactorsStr);
它将打印因子的总和:

a   b
-1  a   c   d

这正是我想要的。

到目前为止,您尝试了什么?请看:我已经创建了一个解析器,可以将表达式转换为AST。这是一个问题。@SuperJMN一个表达式可以有多个级别吗?(例如a+(b/(c/(d*e))-如果是,您计划如何表示它们?老实说,您的问题的答案非常明显:您将深度属性附加到每个级别,对于每个第i个深度,您只需执行操作(然后汇总每个级别)。为了让事情更容易理解,我建议创建一个非常简单的示例,并说明代码中的瓶颈所在。这个问题更像是一个与“设计”相关的任务。没有人嘲笑你,人们会问你迄今为止尝试了什么,以及你遇到了什么困难。如果你的问题是“如何将AST转换为因子和的列表?”,然后答案是“以适当的顺序遍历该树并以适当的格式打印节点”。如果您想知道如何做到这一点,那么您必须向我们展示一个包含此类AST的列表,以及您为遍历该树并打印其节点而编写的代码。