C# 将以字符串形式给出的公式转换为表达式树并应用于数组

C# 将以字符串形式给出的公式转换为表达式树并应用于数组,c#,C#,我有一个“字符串公式”如下: result = colum1 * colum2 来自外部系统。根据此“字符串公式”,我可以创建表达式树并将其应用于数组,如下所示: static void Main(string[] args) { double[,] array = new double[,] { {1.3, 2}, {4.5, 4.2}, }; // expression: result = colum1 * colum2 var c

我有一个“字符串公式”如下:

result = colum1 * colum2
来自外部系统。根据此“字符串公式”,我可以创建表达式树并将其应用于数组,如下所示:

static void Main(string[] args)
{
    double[,] array = new double[,]
    {
    {1.3, 2},
    {4.5, 4.2},
    };

    // expression: result = colum1 * colum2
    var colum1 = Expression.Parameter(typeof(double));
    var colum2 = Expression.Parameter(typeof(double));

    for (int row = 0; row < array.GetLength(0); row++)
    {
    var result = (Expression.Lambda(Expression.Multiply(colum1, colum2), colum1, colum2).
            Compile() as Func<double, double, double>)(array[row, 0], array[row, 1]);
    }
}
static void Main(字符串[]args)
{
双精度[,]数组=新的双精度[,]
{
{1.3, 2},
{4.5, 4.2},
};
//表达式:结果=列1*列2
var colum1=表达式参数(typeof(double));
var colum2=表达式参数(typeof(double));
for(int row=0;row
这是将公式应用于数组每一行的最有效方法吗


另外,如何将“字符串公式”动态转换为表达式树?诚然,上述内容是硬编码的。谢谢P>我几乎不考虑.NET中的任何东西,默认情况下不是最有效的,但是C语言中最有效的可能是自己编码和解析表达式。p> 据我所知,最简单的方法是:


我几乎不考虑.NET中的任何东西在缺省情况下都是最有效的,但是C语言中最有效的可能是自己编码和解析表达式。p> 据我所知,最简单的方法是:


当然,这不是最有效的方法——事实上,这是最低效的方法。在循环外部构建和编译lambda一次,并在内部使用它。对于第二个问题,请看System.Linq.Dynamic软件包。谢谢,请撰写一个答案……当然,这不是最有效的方法——事实上,这是最低效的方法。在循环外部构建和编译lambda一次,并在内部使用它。对于第二个问题,请看System.Linq.Dynamic软件包。谢谢您,请撰写一个答案……很好,这满足了我的要求。它甚至可以解析如下的“公式”((colum1*colum2)/3.12)*10000.123456。请您确认我们的声明是否“将考虑.NET中的几乎任何东西,而不是默认的最有效”。您认为以上是将公式应用于.NET中的扁平数据集的最快的方法之一吗?AFAK有些性能关键部分是用不同的语言编写的,允许更好的优化。我找不到这方面的任何信息,所以如果我错了,我希望有人能纠正我。表达式可能是计算表达式最慢的方法之一,但我建议对其进行测试,看看差异是否足够显著。为了获得更好的性能,您可以查看右侧的一些相关链接。谢谢!澄清一下,您在回答中使用的是DataColumn.Expression吗?@csetzkorn是的,
列的第三个参数。Add
就是这个表达式。很好,这满足了我的要求。它甚至可以解析如下的“公式”((colum1*colum2)/3.12)*10000.123456。请您确认我们的声明是否“将考虑.NET中的几乎任何东西,而不是默认的最有效”。您认为以上是将公式应用于.NET中的扁平数据集的最快的方法之一吗?AFAK有些性能关键部分是用不同的语言编写的,允许更好的优化。我找不到这方面的任何信息,所以如果我错了,我希望有人能纠正我。表达式可能是计算表达式最慢的方法之一,但我建议对其进行测试,看看差异是否足够显著。为了获得更好的性能,您可以查看右侧的一些相关链接。谢谢!澄清一下,您在回答中使用的是DataColumn.Expression吗?@csetzkorn是的,
列的第三个参数Add
就是这个表达式。
var dt = new DataTable();
dt.Columns.Add("colum1", typeof(double));
dt.Columns.Add("colum2", typeof(double));
dt.Columns.Add("result", typeof(double), "colum1 * colum2");

var dr = dt.Rows.Add(1.3, 2);
Debug.Print($"{dr[0]} * {dr[1]} = {dr[2]}");  // "1.3 * 2 = 2.6"