在C#中是否有eval函数?

cla*_*ner 9 c# math eval

我正在键入一个方程式textbox,它将生成给定抛物线的图形.是否可以使用eval函数?我的C#2010没有microsoft.jscript.

Teo*_*gul 25

C#没有可比较的Eval函数,但创建一个非常简单:

public static double Evaluate(string expression)  
       {  
           System.Data.DataTable table = new System.Data.DataTable();  
           table.Columns.Add("expression", string.Empty.GetType(), expression);  
           System.Data.DataRow row = table.NewRow();  
           table.Rows.Add(row);  
           return double.Parse((string)row["expression"]);  
       }
Run Code Online (Sandbox Code Playgroud)

现在简单地称它为:

Console.WriteLine(Evaluate("9 + 5"));
Run Code Online (Sandbox Code Playgroud)

  • 哇.那真是偷偷摸摸=) (3认同)
  • 请注意,这仅计算非常简单的数学表达式。为了获得更好的性能,您可以将数据表保留在函数之外。 (2认同)

小智 7

您可以使用DataTable类的"Compute"方法轻松完成此操作.

static Double Eval(String expression)
{
    System.Data.DataTable table = new System.Data.DataTable();
    return Convert.ToDouble(table.Compute(expression, String.Empty));
}
Run Code Online (Sandbox Code Playgroud)

将字符串形式的术语传递给函数以获得结果.

Double result = Eval("7 * 6");
result = Eval("17 + 4");
...
Run Code Online (Sandbox Code Playgroud)


Raz*_*dze 6

您可以使用 CodeDom 自己创建一个。它会很慢,因为每次调用 Eval 时它都会创建一个新程序集。

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(ExpressionEvaluator.Eval("(2 + 2) * 2"));
    }
}

public class ExpressionEvaluator
{
    public static double Eval(string expression)
    {
        CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        CompilerResults results =
            codeProvider
            .CompileAssemblyFromSource(new CompilerParameters(), new string[]
            {
                string.Format(@"
                    namespace MyAssembly
                    {{
                        public class Evaluator
                        {{
                            public double Eval()
                            {{
                                return {0};
                            }}
                        }}
                    }}

                ",expression)
            });

        Assembly assembly = results.CompiledAssembly;
        dynamic evaluator = 
            Activator.CreateInstance(assembly.GetType("MyAssembly.Evaluator"));
        return evaluator.Eval();
    }
}
Run Code Online (Sandbox Code Playgroud)