如何计算表达式

发布于 2024-12-29 07:59:33 字数 186 浏览 0 评论 0原文

考虑这个代码片段;

int sum = 0;
sum = Expression.Evaluate("1+1");

其中 sum = 2 的值

我确实有一个可以计算值的表达式,但我希望以编程方式构建该表达式,然后评估结果。我不知道我将处理什么类或名称空间。任何人都可以帮助我。

Consider this code fragment;

int sum = 0;
sum = Expression.Evaluate("1+1");

where the value of sum = 2

I do have an expression that will compute values but i want that expression to be build programatically then evaluate the result. I don't have any idea what class or namespace that I will dealing with. Anyone can help me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冷夜 2025-01-05 07:59:33

您可以使用表达式树:

表达式树表示树状数据结构中的代码,其中
每个节点都是一个表达式,例如方法调用或二进制
诸如 x < 之类的运算y。

您可以编译并运行表达式树表示的代码。

注意:这个问题可以使用System.Reflection.Emit来解决,并直接使用MSIL,但生成的代码很难编写和阅读。

经过一番浏览后,我建议您在 Codeplex 上查看 Flee:快速轻量级表达式评估器

Flee 是 .NET 框架的表达式解析器和求值器。
允许您计算字符串表达式的值,例如 sqrt(a^2
+ b^2) 在运行时
。它使用自定义编译器、强类型表达式语言和轻量级代码生成器来编译表达式
直接到IL。这意味着表达式求值非常重要
快速高效。

You could use Expression Trees:

Expression trees represent code in a tree-like data structure, where
each node is an expression, for example, a method call or a binary
operation such as x < y.

You can compile and run code represented by expression trees.

Note: This problem can be solved using System.Reflection.Emit and work directly with MSIL, but the resulting code is hard to write and read.

After a little browsing, I suggest you checkout Flee on Codeplex: Fast Lightweight Expression Evaluator :

Flee is an expression parser and evaluator for the .NET framework. It
allows you to compute the value of string expressions such as sqrt(a^2
+ b^2) at runtime
. It uses a custom compiler, strongly-typed expression language, and lightweight codegen to compile expressions
directly to IL. This means that expression evaluation is extremely
fast and efficient.

明月松间行 2025-01-05 07:59:33

您可以使用 lambda 或使用 System.Linq.Expressions 命名空间中的类以编程方式构建表达式树。

有关详细信息,请参阅 MSDN

You can build Expressions trees either using lambdas or by building them programatically using classes in the System.Linq.Expressions namespace.

See MSDN for more info.

怼怹恏 2025-01-05 07:59:33

您看过 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());

它还处理 unicode &许多本地数据类型。如果您想更改语法,它会附带一个鹿角文件。还有一个支持 MEF 加载新功能的 fork。

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

Have you seen http://ncalc.codeplex.com ?

It's extensible, fast (e.g. has its own cache) enables you to provide custom functions and varaibles at run time by handling EvaluateFunction/EvaluateParameter events. Example expressions it can parse:

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());

It also handles unicode & many data type natively. It comes with an antler file if you want to change the grammer. There is also a fork which supports MEF to load new functions.

It also supports logical operators, date/time's strings and if statements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文