我很难理解 NCalc,我有几个问题。
1) 如果我有一个像“if(CLOSE<2.3,ROC(OPEN),HIGH)”这样的表达式并且 ROC 是一个自定义函数。在评估条件“CLOSE<2.3”时,“ROC(OPEN)”的结果是否可用?
2)我如何覆盖“如果”语句?对于下面的情况,我想对“listOpen”中的每个元素进行条件检查。如果条件评估为 TRUE,则我需要从“listROC”返回条件评估为 true 的索引处的值,否则从 listHigh 返回相同索引处的值。
例子 :
List<double> listResult = new List<double>();
for(int index = 0; index< listClose.count;index++)
{
if(listClose[index]<2.3)
listResult.Add(listROC[index]);
else
listResult.Add(listHigh[index]);
}
return listResult;
这是我试图评估表达式的示例代码。我坚持覆盖/定义自定义 if 语句。
private List<double> listOpen = new List<double>();
private List<double> listClose = new List<double>();
private List<double> listHigh = new List<double>();
public void PrepareData()
{
for (int index = 0; index < 10; index++)
{
Random rnd = new Random();
double open = rnd.NextDouble() * (2.5 - 2.0) + 2.0;
listOpen.Add(open);
double close = rnd.NextDouble() * (2.5 - 2.0) + 2.0;
listClose.Add(close);
double high = rnd.NextDouble() * (2.5 - 2.0) + 2.0;
listHigh.Add(high);
}
}
private void EvaluateExpression()
{
PrepareData();
Expression ex = new Expression("if(CLOSE<2.3,ROC(OPEN),HIGH)");
ex.EvaluateFunction += delegate(string name, FunctionArgs args)
{
if (name == "ROC")
{
List<double> listROC = new List<double>();
string argument = args.Parameters[0].Evaluate().ToString();
List<double> listParam = new List<double>();
switch (argument)
{
case "OPEN":
listParam = listOpen;
break;
case "CLOSE":
listParam = listClose;
break;
case "HIGH":
listParam = listHigh;
break;
}
foreach (double dbl in listParam)
{
double result = dbl * 2;
listROC.Add(result);
}
args.Result = listROC;
}
if (name == "if")
{
//Override the if function
}
};
object ob = ex.Evaluate();
}
任何帮助深表感谢。