首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖NCalc中的"if“语句

覆盖NCalc中的"if“语句
EN

Stack Overflow用户
提问于 2012-04-18 09:11:58
回答 2查看 3.6K关注 0票数 0

我正在努力理解NCalc,我有几个问题要问。

1)如果我有一个类似于" If (CLOSE<2.3,ROC(OPEN),HIGH)“的表达式,ROC是一个自定义函数。在计算条件"CLOSE<2.3“时,"ROC(OPEN)”的结果是否可用?

2)如何覆盖If语句?对于下面的情况,我想对"listOpen“中的每个元素执行条件检查。如果条件求值为真,那么我需要从"listROC“返回条件求值为真的索引处的值,否则从listHigh返回相同索引处的值。

示例:

代码语言:javascript
复制
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语句上。

代码语言:javascript
复制
    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();
    }

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2012-04-19 12:44:54

我不知道你想要达到什么目的,也许如果你能解释得更多一些会对你有帮助。你不能重写" if ",以防你不希望IF行为像内置的那样,在表达式中使用IF()或Filter()这样的词

票数 0
EN

Stack Overflow用户

发布于 2015-01-28 23:09:44

我的理解是:

1)表达式被一起解析,但随后根据深度进行计算。因此,将评估if谓词CLOSE<2.3是否为真,如果为真,则将评估ROC(OPEN)。如果您试图在参数声明之前使用它们,这将是一个问题--例如,如果您编写了一个自定义MAP(arg_array, callback([i])),它将解析期望参数[i]从求值开始就存在的callback([i])

2)只要你处理函数名并设置一个结果,它就应该覆盖任何可能发生的本机处理。我犯了一个错误,做了一个方便的处理程序,它总是设置结果(或者如果它不能识别函数,就抛出一个异常),这会在无法识别的if语句上抛出异常。您也可以使用IF (区分大小写)定义自己的if语句。

但我认为你的问题是CLOSEOPEN应该是静态值,所以应该转义为像'CLOSE''OPEN'这样的字符串。或声明为参数并进行相应处理。https://ncalc.codeplex.com/wikipage?title=parameters

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10201449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档