像C#的计算引擎这样的东西?

chi*_*tom 9 c# propagation

是否有任何C#计算引擎可以在值更改时自动重新计算相关字段?

让我自由泳一秒钟,我想象这样的事情..

 Field<double> quantity = Field.Create<double>("Quantity");
 Field<double> unitCost = Field.Create<double>("Unit Cost");
 Field<double> total = Field.Create<double>("Total");

 total.Calculation((q,uc) => q * uc, quantity, value);
      // would have signature something like this:
      // void Calculation<TR,T1,T1>(Func<TR,T1,T2>, Field<T1>, Field<T2>)
Run Code Online (Sandbox Code Playgroud)

这将设置自动传播依赖值的字段.

 quantity.Value = 5.0;
 unitCost.Value = 1.5;
 Assert.That(total.Value, Is.EqualTo(7.5));
Run Code Online (Sandbox Code Playgroud)

显然这是一个简单的例子,最终用途更类似于复杂电子表格的计算.

进一步思考,如果字段/单元格支持更改通知,那将是惊人的.

Gre*_*oud 5

你见过http://ncalc.codeplex.com吗?

它的可扩展性,快速性(例如,具有自己的缓存)使您能够通过处理EvaluateFunction/EvaluateParameter事件在运行时提供自定义函数和变量.它可以解析的示例表达式:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)");

  e.Parameters["Pi2"] = new Expression("Pi * Pi");
  e.Parameters["X"] = 10;

  e.EvaluateParameter += delegate(string name, ParameterArgs args)
    {
      if (name == "Pi")
      args.Result = 3.14;
    };

  Debug.Assert(117.07 == e.Evaluate());
Run Code Online (Sandbox Code Playgroud)

它还可以本地处理unicode和许多数据类型.如果你想改变语法,它会附带一个鹿茸文件.还有一个支持MEF加载新功能的fork.

它还支持逻辑运算符,日期/时间的字符串和if语句.

一个办法

您可以通过实现INotifyPropertyChanged然后执行类似操作来自动重新计算

  • 设置一个字段的表达式this.Field.Expression = new Expression("Field1 + Field2");

关于课堂上的notifypropertyupdated

  • 对于作为函数的每个字段(带反射)
  • 如果它的表达式引用了更改的字段,则重新计算变量.
  • 在重新计算时,您需要处理EvaluateParameter事件以使用反射来查找正确的字段并提取其值(如果需要,您可以缓存以避免反射)

  • 太希望它处理羊粪太*叹气* (3认同)