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
现在让我们假设Name==“A”字段的值更改为25.0。当这种情况发生时,C需要计算为'25.0+0.0',然后需要计算E。但是计算E首先需要计算D,计算D也需要计算G

是否有一种标准算法或数据结构使得确定a)应计算哪些字段值以及在任何给定字段的值发生变化时以何种顺序计算,以及b)以适当的顺序计算这些字段成为必要

作为奖励,在如下场景中,可以确定集合中公式的配置中是否存在无限(左?)递归:

  • 名称:“A”公式:“B”值:0.0
  • 名称:“B”公式:“A*10”值:0.0
  • 名称:“C”;公式:“A+B”;值:0.0
  • 名称:“D”;公式:“B+C”;值:0.0
我已经有一段时间没有做过这样的事情了(从大学开始就没有做过),如果有什么需要澄清的地方,请告诉我


谢谢。

构造一个表达式图并应用于它。如果表达式包含一个循环,拓扑排序算法将检测它,并报告您的表达式不是一个非循环图。按相反的拓扑顺序计算节点可以让您计算表达式的值


为了找到需要重新评估的节点,请构造一个反向依赖关系图,并计算其值。当节点在运行时更改状态时,请查阅预计算的闭包以查找需要重新评估结果的所有节点的列表。这些节点需要按照与拓扑排序一致的顺序重新评估

我的第一个想法是,为什么要担心它们的运行顺序呢?当你查询G时,它会得到D的值。当它试图得到D的值时,它会消失,得到E和F的值,等等。本质上,它会存储公式,然后在你需要时计算值,这样你就不需要担心更新事情。检测循环是很重要的一点,这可能取决于你已经在解析你的公式了。是的,我也在尝试找出那个例子中的无限递归是什么…对不起,我修正了最后一个例子以使其更有意义。这正是我需要的方向。遵循你的建议非常有效。谢谢你的帮助。