从属变量循环C#

时间:2015-09-26 23:13:40

标签: c# loops

我想问一个关于如何处理因变量的问题。

C1=MA(X,10)
C2=MA(C1,10)
C3=C2.Minus(C1)
C4=MA(C3,10)
Final=C4.Minus(C3)

插图:Final = C4.Minus(C3),我保存了两个参数C4,C3。

  C4(MA ok and firstTime in MA)--> C3(MA NotOK,not fstTime)---> C2(MA ok)--->C1(MA ok)
                       0------------------->  10-------------->  10+10---->10+10+10=30

我首先创建了一个类来获取每行的所有信息

    public class IndicatorInform
    {
        char[] parenthesis = new []{'(',')'};
        char[] equal = new char[] { '=' };
        char[] comma = new char[] { ';' };
        char[] all = new char [] { '.','<'};


        string text=null;
        string funcname=null;
        string[] args=null;

        public void IndicatorInform (string expression, out string text,out string funcName,out string [] args)
        {
           string [] parts= expression.Split(equal);
           text = parts[0];
           if( parts[1].Contains(";"))
           {
               string[] subparts = parts[1].Split(parenthesis);
               funcname = subparts[0];
               args = subparts[1].Split(comma);
               if(args.Count.equal(2))
               {
                   funcarg = args[0];
                   period = Convert.ToDouble(args[1]);
               }
           }
           else
           {
               if (parts[1].Contains("Plus"))
                   funcname = "Plus";
               if (parts[1].Contains("Minus"))
                   funcname = "Minus";
               if (parts[1].Contains("Multi"))
                   funcname = "Multi";
               if (parts[1].Contains("Div"))
                   funcname = "Div";
               parts[1] = parts[1].Replace(funcname, "");
               args=parts[1].Split(all);
           }
        }
        public double Shifts {get; set;}
        public double period { get; set; }
        public string Funcname { get; set; }
        public string text { get; set; }
        public string funcarg { get; set; }
    }

然后我创建了一个Dictonary并开始处理因变量

   Dictionary<string,SubIndicator> Dico=new Dictionary<string,SubIndicator> ;
        foreach (var line in richTextBox1.Lines)
        {
            SubIndicator SubInc = new SubIndicator();
            Dico.Add(SubInc.text,SubInc);
        }
        int incre=0;
        double tempvalue=0;
        foreach( string element in Dico.Keys)
        {
            string[] tempo=null;
            if(Dico[element].text.Contains("Final"))
            {
                tempo=Dico[element].args;
            }
            else
            {
                if(tempo.Contains(Dico[element].text))
                {
                    if(Dico[element].Funcname.Contains("MA") )
                    {
                        if (incre.Equals(0))
                        {tempvalue=Dico[element].period;
                        incre++;}
                        else
                        {
                            Dico[element].Shifts=tempvalue+Dico[element].period;
                            tempvalue =Dico[element].Shifts;
                        }
                    }
                    else
                    {
                        Dico[element].Shifts=tempvalue;
                    }
                }
            }

我的算法适用于上述情况。但是如何处理更复杂的情况,如

  C1=MA(X,10) 
  C2=MA(X,20)
  C3=MA(C1,5)
  C4=MA(C2,10) 
  C5=MA(C3,15)
  C6=MA(C4,10)
  Final=C6.Minus(C5)
 C6(fst Time)---->C4--->C2         C5(fst Time)--->C3--> C1
            0-->10+10-->10+10+20              0--> 15+5-->15+5+10

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我想我需要写一个更长的答案。数学函数需要有一个带元素/节点的二叉树,这是一个包含左节点,右节点,值和数学运算符的类。元素通常是一个类对象,可以是字典中的值。叶子节点将包含值,而非叶子节点将具有左节点,右节点或左右节点的运算符。

数学函数是关联的,因此任何函数都可以分为左右分量,如a = b +(c + d + e + f)。 b是左侧分量,(c + d + e + f)是右侧分量。右侧组件可以进一步分为左侧和右侧。

你的代码需要两件。第一种是将输入解析为元素。第二部分是计算结果。递归函数将执行计算。递归检查以查看元素是否包含左节点和/或右节点,并一直调用递归函数,直到找到包含值的叶子。然后向上移动函数调用堆栈,用左右组件返回的值替换数学运算符。