C# 如何构造基于一组公式计算对象值的算法?
假设我有以下字段对象的集合:C# 如何构造基于一组公式计算对象值的算法?,c#,algorithm,C#,Algorithm,假设我有以下字段对象的集合: public class Field { public string Formula { get; set; } public string Name { get; set; } public double Value { get; set; } } 每个字段都有一个唯一的名称。有些字段有一个公式。公式是一个数学表达式,用于计算字段的值,其中输入是集合中由其名称表示的其他字段。我所给的集合可能如下所示: 名称:“A”;公式:“;数值:0.
public class Field
{
public string Formula { get; set; }
public string Name { get; set; }
public double Value { get; set; }
}
每个字段都有一个唯一的名称。有些字段有一个公式。公式是一个数学表达式,用于计算字段的值,其中输入是集合中由其名称表示的其他字段。我所给的集合可能如下所示:
- 名称:“A”;公式:“;数值:0.0
- 名称:“B”;公式:“;数值:0.0
- 名称:“C”;公式:“A+B”;数值:0.0
- 名称:“D”;公式:“E+F”;数值:0.0
- 名称:“E”;公式:“C+14”;数值:0.0
- 名称:“F”;公式:“;数值:0.0
- 名称:“G”;公式“D*.0.05”;数值:0.0
- 名称:“A”公式:“B”值:0.0
- 名称:“B”公式:“A*10”值:0.0
- 名称:“C”;公式:“A+B”;值:0.0
- 名称:“D”;公式:“B+C”;值:0.0
谢谢。构造一个表达式图并应用于它。如果表达式包含一个循环,拓扑排序算法将检测它,并报告您的表达式不是一个非循环图。按相反的拓扑顺序计算节点可以让您计算表达式的值
为了找到需要重新评估的节点,请构造一个反向依赖关系图,并计算其值。当节点在运行时更改状态时,请查阅预计算的闭包以查找需要重新评估结果的所有节点的列表。这些节点需要按照与拓扑排序一致的顺序重新评估我的第一个想法是,为什么要担心它们的运行顺序呢?当你查询G时,它会得到D的值。当它试图得到D的值时,它会消失,得到E和F的值,等等。本质上,它会存储公式,然后在你需要时计算值,这样你就不需要担心更新事情。检测循环是很重要的一点,这可能取决于你已经在解析你的公式了。是的,我也在尝试找出那个例子中的无限递归是什么…对不起,我修正了最后一个例子以使其更有意义。这正是我需要的方向。遵循你的建议非常有效。谢谢你的帮助。