【问题标题】:C# evaluate a string expression and return the resultC# 计算字符串表达式并返回结果
【发布时间】:2019-06-13 12:33:07
【问题描述】:

试图找出在 .net/C# 中使用哪种方法来评估运行时的简单表达式。代码必须符合 .net 标准,并且我不想要奇怪的依赖。

我已经研究过使用 Microsoft.CodeAnalysis.CSharp.Scripting: How can I evaluate C# code dynamically? 但对我的用例来说似乎有点过分了。

public class Evaluate
    {
        private Dictionary<string, object> _exampleVariables = new Dictionary<string, object>
        {
            {"x", 45},
            {"y", 0},
            {"z", true}
        };
        private string _exampleExpression = "x>y || z";
        private string _exampleExpression2 = @"if(x>y || z) return 10;else return 20;
";
        public object Calculate(Dictionary<string, object> variables, string expression)
        {
            var result = //Magical code
            return result;
        }
    }

【问题讨论】:

  • 这就是你要找的吗? Evaluating string “3*(4+2)” yield int 18
  • 是的,它看起来很有希望并且被接受的答案似乎类似于 Microsoft.CodeAnalysis.CSharp.Scripting。不过我担心电源。用户可以访问比表达式结果更多的资源。
  • 如果不知道“简单”是什么意思,很难说。我不会将示例 2 称为简单 - 允许哪些其他语句?另外,为什么示例 2 需要return
  • 这是我的infix expression evalutor。处理变量和多位值和表达式语句的扩展留给读者。
  • @NetMage 示例 2 仅显示了将表达式编写为 if else 语句的可能性。

标签: c# string dynamic logic expression


【解决方案1】:

在 C# 中你可以这样做:

class Program
{
    private static Func<Dictionary<string, object>, object> function1 = x =>
    {
        return ((int)x["x"] > (int)x["y"]) || (bool)x["z"];
    };

    private static Func<Dictionary<string, object>, object> function2 = x =>
    {
        if (((int)x["x"] > (int)x["y"]) || (bool)x["z"])
        {
            return 10;
        }
        else
        {
            return 20;
        }
    };

    static void Main(string[] args)
    {
        Dictionary<string, object> exampleVariables = new Dictionary<string, object>
        {
            {"x", 45},
            {"y", 0},
            {"z", true}
        };

        Console.WriteLine(Calculate(exampleVariables, function2));
    }

    public static object Calculate(Dictionary<string, object> variables, Func<Dictionary<string, object>, object> function)
    {
        return function(variables);
    }
}

【讨论】:

  • 感谢您的尝试,但除非我读错了,否则您将为示例字段创建一个具体的解决方案。他们的意图只是给出并了解计算方法必须处理的内容。表达式可以是任何东西:“true && true && false”,用​​户在运行时输入。
  • 我这样做是为了向您展示,您可以创建一种可以以不同方式评估的方法,但无论如何它不能实时工作
【解决方案2】:

你可以试试我的 Matheval 库。它可以在纯 C# 中评估字符串表达式,并支持 IFELSE、SWITCH 语句。我不使用任何依赖项。

using System;
using org.matheval;
                    
public class Program
{
    public static void Main()
    {
        Expression expression = new Expression("IF(time>8, (HOUR_SALARY*8) + (HOUR_SALARY*1.25*(time-8)), HOUR_SALARY*time)");
        //bind variable
        expression.Bind("HOUR_SALARY", 10);
        expression.Bind("time", 9);
        //eval
        Decimal salary = expression.Eval<Decimal>();    
        Console.WriteLine(salary);
    }
}

查看我的仓库:https://github.com/matheval/expression-evaluator-c-sharp/

【讨论】:

  • 这个可以支持逻辑表达式吗?如 1 和 1 和 false 和 true 和 (3>X) 或 somevar 和 (X>4/6 +9)
  • 请看这个例子:dotnetfiddle.net/h3HVnV
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2013-12-15
相关资源
最近更新 更多