是否有任何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)
显然这是一个简单的例子,最终用途更类似于复杂电子表格的计算.
进一步思考,如果字段/单元格支持更改通知,那将是惊人的.
你见过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然后执行类似操作来自动重新计算
关于课堂上的notifypropertyupdated