覆盖 NCalc 中的“if”语句
本文关键字:语句 if NCalc 中的 覆盖 | 更新日期: 2023-09-27 18:31:31
我正在努力理解NCalc,我有几个问题。
1)如果我有一个像"if(CLOSE<2.3,ROC(OPEN),HIGH)"这样的表达式,ROC是一个自定义函数。"ROC(OPEN)"的结果在评估条件"CLOSE<2.3"时是否可用?
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();
}
任何帮助都非常感谢。
无法弄清楚 ou 想要实现的目标,也许如果你能解释更多,就能更好地帮助你。 你不能覆盖"if",如果你不希望行为像内置的东西一样,在表达式中使用其他一些词,如 IF() 或 Filter()
我的理解是:
1) 表达式一起解析,然后根据深度进行评估。 因此,if
谓词CLOSE<2.3
将被评估为真,如果为真,则将评估ROC(OPEN)
。 如果您在声明参数之前尝试使用参数,这将是一个问题 - 就像您编写自定义MAP(arg_array, callback([i]))
一样,它将解析callback([i])
期望参数[i]
从评估开始就存在。
2)只要您处理函数名称并设置结果,它就应该覆盖可能发生的任何本机处理。 我犯了一个错误,即制作了一个方便的处理程序,该处理程序始终设置结果(或者如果它无法识别函数,则抛出异常),该处理程序在无法识别的if
语句上抛出异常。 您也可以始终使用 IF
(区分大小写)定义自己的 if 语句。
但我认为你的问题是CLOSE
和OPEN
应该是静态值,因此应该作为 'CLOSE'
和 'OPEN'
等字符串进行转义。 或声明为参数并相应地处理。https://ncalc.codeplex.com/wikipage?title=parameters