动态求解方程

时间:2015-12-17 12:23:10

标签: c#

我正在开发一个C#应用程序,我需要动态求解方程式。例如,我现在有以下内容:

decimal[] v1s = GetV1Values();
decimal[] v2s = GetV2Values();

if (v1s.Length != v2s.Length) 
{
  throw new Exception();
}

string[] equations = new string[] {
  "$V1 + $V2",
  "$V1 * 3 - $V2",
  "$V1 - $V2"
};

foreach (var equation in equations)
{
  for (var i=0; i<v1s.Length; i++)
  {
    var op1 = v1s[i];
    var op2 = v2s[i];

    var result = ?  // I'm not sure how to plug op1 and op2 into equation
    Console.WriteLine(equation + " = " + result;
  }
}

如何从值数组中获取值并将其插入equation并获得结果?我愿意在C#中使用不同的方法来解决这个问题。我只是不确定如何评估C#中的方程式。

2 个答案:

答案 0 :(得分:0)

Yon可以通过使用Delegates数组来完成此操作。您可以存储方法调用,而不是将方程式存储为字符串数组。 像

这样的东西
Func<int>[] equations = { eqn1, eqn2, eqn3 };  
foreach (var equation in equations)
{
  for (var i=0; i<v1s.Length; i++)
  {
    var op1 = v1s[i];
    var op2 = v2s[i];

    var result = equation(op1, op2);
    Console.WriteLine(equation + " = " + result;
  }
} 

public static int eqn1 (int v1, int v2)  
{  
  return v1 + v2;  
}  
public static int eqn2 (int v1, int v2)  
{   
  return v1 * 3 - v2;  
}  
public static int eqn3 (int v1, int v2)  
{   
  return v1 - v2;  
} 

<强>更新 以下是工作示例:

public delegate decimal Eqn(decimal v1, decimal v2);
public static void Main(string[] args)
{
  decimal[] v1s = {4, 5, 6}; //GetV1Values();
  decimal[] v2s = {2, 3, 4}; //GetV2Values();

  Eqn[] equations = { eqn1, eqn2, eqn3 };  
  foreach (var equation in equations)
  {
    for (var i=0; i<v1s.Length; i++)
    {
      var op1 = v1s[i];
      var op2 = v2s[i];

      var result = equation(op1, op2);
      Console.WriteLine("Result = " + result);
    }
  } 
}
public static decimal eqn1 (decimal v1, decimal v2)  
{  
  return v1 + v2;  
}  
public static decimal eqn2 (decimal v1, decimal v2)  
{   
  return v1 * 3 - v2;  
}  
public static decimal eqn3 (decimal v1, decimal v2)  
{   
  return v1 - v2;  
}

答案 1 :(得分:0)

一旦你走下评估表达的道路,就必须知道

  1. 表达式的语法a.k.a是什么?
  2. 您是否需要使用c#来评估表达式?
  3. 您的应用中需要多久评估一次表达式?是否有性能方面的考虑?
  4. 你的表达式会支持函数吗?
  5. 在不知道某些背景的情况下,我无法帮助你。我将做出一些广泛的假设,并提出一些可能对你有帮助的想法。

    1. 您可以让调用者在c#中提供表达式。您可以自动生成一个简单的c#app来评估该表达式。并且您的函数将简单地生成一个带有args的进程来评估表达式
    2. 如果你有这个选项,你可以使用像perl这样的动态语言代替c#。 perl上的一个简单eval块可以对动态代码块进行评估。
    3. 如果您想以有效的方式执行此操作,您可能会为您的执行生成表达式树,然后对其进行评估。您也可以尝试简单的反向抛光计算器。你可以google它。寻找crenshaw的一些in-fix表达式评估。
    4. 此外,在表达式中放置值的一种简单方法是使用string.format