我需要让用户可以在 datagridview 中编写自己的公式。类似于 Excel 中的函数。
公式定义示例:
因此,用户在公式单元格中编写自己的公式,然后在其他表格中显示每个公式的结果。我怎么能做到这一点?
我会尝试NCalc
NCalc 是 .NET 中的数学表达式求值器。NCalc 可以解析任何表达式并评估结果,包括静态或动态参数和自定义函数。
Dictionary<string, int> dict = new Dictionary<string, int>() { { "Income", 1000 }, { "Tax", 5 } };
string expressionString = "Income * Tax";
NCalc.Expression expr = new NCalc.Expression(expressionString);
expr.EvaluateParameter += (name, args) =>
{
args.Result = dict[name];
};
int result = (int)expr.Evaluate();
有很多方法可以做到这一点,它们都围绕着将公式转换为可执行代码。您想编写自己的解析器还是想使用现有的解析器。C# 本身,IronPython,IronRuby,一些现成的组件。如果您使用完整的解析器,您可能想看看如何限制用户可以用它做的事情,无论是无意还是其他......
如果它们看起来很简单,那么某种表达式构建器(选择两个命名值和一个运算符)可能是要走的路,但是模块化,构建表达式和评估它,以便您以后可以加强.
但是考虑到它们看起来多么简单,我很想预定义表达式(从某种后备存储中作为元数据加载,并使其选择其中之一,而不是用户输入它。你可以轻松地花几个月的时间在这个设计方面,值得吗?
我最近在我正在处理的一个项目中遇到了类似的要求(表达式的动态解析),最终使用了来自 WF(Windows Workflow Foundation)的 VB 表达式。这当然取决于此功能对您的重要性以及您愿意为此付出多少努力。就我而言,它比 NCalc 更好,原因如下:
不管怎样,这是我写的关于这个主题的一篇简短的博文。
几年前我创建了信天翁表达式解析器。它已经开源了一段时间,但我终于绕过并发布了 v2.02 并最近添加了文档。它正在积极维护中。它有几个不错的功能: