2012-04-18 64 views
0

我很努力地理解NCalc,並且我有幾個問題。 1)如果我有一個像「if(CLOSE < 2.3,ROC(OPEN),HIGH)」的表達式,並且ROC是自定義函數。當條件「CLOSE < 2.3」正在評估時,「ROC(OPEN)」的結果是否可用?覆蓋NCalc中的「if」語句

2)如何覆蓋「If」語句?對於下面的情況,我想對「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(); 
    } 

任何幫助,非常感謝。

回答

0

不能確定你正在努力達到什麼目標,也許如果你能解釋更多的話可以更好地幫助你。你不能越權「如果」,櫃面你不想如果行爲要像什麼內在的使用一些其他的字一樣,如果()或表達式過濾()

0

我的理解是:

1)表達式解析一起,但隨後根據深度進行評估。因此if謂詞CLOSE<2.3將被評估爲真,然後如果真的ROC(OPEN)將被評估。如果您嘗試在聲明之前嘗試使用參數,則會出現問題 - 例如,如果您編寫了自定義MAP(arg_array, callback([i])),則會解析callback([i]),從評估開始,預計參數[i]會出現。 2)只要你處理函數名並設置一個結果,它就應該覆蓋任何本來會發生的處理。我犯了一個方便處理程序的錯誤,該處理程序總是設置結果(或者拋出一個異常,如果它不能識別該函數的話),它會拋出無法識別的語句中的異常。你也可以用IF(區分大小寫)來定義你自己的if語句。


但我覺得你的問題是,CLOSEOPEN應該是靜態值,因此應該被轉義爲像'CLOSE''OPEN'不是字符串。或者聲明爲參數並進行相應處理。 https://ncalc.codeplex.com/wikipage?title=parameters