2

我需要让用户可以在 datagridview 中编写自己的公式。类似于 Excel 中的函数。

公式定义示例:

X

因此,用户在公式单元格中编写自己的公式,然后在其他表格中显示每个公式的结果。我怎么能做到这一点?

4

5 回答 5

2

我会尝试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();
于 2012-04-08T13:17:31.713 回答
0

您的公式可以操作为 C# 并使用 SystemCodeCom.Compiler 动态编译,您可以在运行时运行它并输入您的变量值。
否则,您将不得不使用某种小型解析器/编译器 - 这是一项相当特殊的技能,并且可能很快变得复杂 - 特别是如果您的公式变得更加复杂(可能)。这里这里
有关于动态编译的代码项目文章。但是网上还有很多其他的例子。

于 2012-04-08T12:51:12.340 回答
0

有很多方法可以做到这一点,它们都围绕着将公式转换为可执行代码。您想编写自己的解析器还是想使用现有的解析器。C# 本身,IronPython,IronRuby,一些现成的组件。如果您使用完整的解析器,您可能想看看如何限制用户可以用它做的事情,无论是无意还是其他......

如果它们看起来很简单,那么某种表达式构建器(选择两个命名值和一个运算符)可能是要走的路,但是模块化,构建表达式和评估它,以便您以后可以加强.

但是考虑到它们看起来多么简单,我很想预定义表达式(从某种后备存储中作为元数据加载,并使其选择其中之一,而不是用户输入它。你可以轻松地花几个月的时间在这个设计方面,值得吗?

于 2012-04-08T13:14:48.857 回答
0

我最近在我正在处理的一个项目中遇到了类似的要求(表达式的动态解析),最终使用了来自 WF(Windows Workflow Foundation)的 VB 表达式。这当然取决于此功能对您的重要性以及您愿意为此付出多少努力。就我而言,它比 NCalc 更好,原因如下:

  • 它支持比 NCalc 更复杂的表达式
  • 可以分析生成的表达式树以确定各个表达式的依赖关系
  • 它与 WF 中的表达式语言相同(我已经在项目的其他地方使用过)

不管怎样,这是我写的关于这个主题的一篇简短的博文。

于 2012-04-08T15:43:03.220 回答
0

几年前我创建了信天翁表达式解析器。它已经开源了一段时间,但我终于绕过并发布了 v2.02 并最近添加了文档。它正在积极维护中。它有几个不错的功能:

  • 圆形参考检测
  • 直接来自外部对象的源变量
  • 表达式的反向生成
  • 正确记录
于 2018-04-17T03:57:07.620 回答