2016-06-13 2 views
0

私はスイッチに複数のケースがあります。特定の基準が満たされるまで、一度に1つのケースにとどまるためのコードが必要です。次に、どのケースに進むべきかを伝えたいと思います。私は現在、自分自身になるケースがありますが、これはエラーを引き起こすものではありませんが、私が使用しているプログラムが継続的にロードされ、実行されることはありません。C#スイッチ内の特定のケースを繰り返す

私が満たしていなければならない基準は、boolステートメント 'activated'です。それまではコードはそのまま残しておきたいと思います。

多くのコードがありませんので、意味をなさないかもしれませんが、これを行うより良い方法があるかどうかを知りたいと思います。

また、尋ねる前に、私はまだ初心者であり、誰もがgoto文を嫌うことは知っています。あなたが代案を提案できるなら、私は聞きます。

ありがとうございます。

if(CurrentPosition.Value != 0){ 
      switch(location) 
      { 

       case 0: 
        if(criteria1 && criteria2) 
        { 
         LimitLongsPT.Send(S1 + ((R1 - S1) * BuffZone)); 
         LongStopSA.Send(S1 - StopAmount); 
         ShortStopDeep.Send(R1 + StopAmount); 
         TradeManager.ProcessEvents(); 
         if(activated == true) 
         { 
          if(PublicFunctions.DoubleEquals(CurrentPosition.Value, 0)) 
          { 
           break; 
          } 
          if(PublicFunctions.DoubleLess(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], S1) && PublicFunctions.DoubleLess(MP[0], R1)) 
           { 
            goto case 15; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            goto case 16; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], S2) && PublicFunctions.DoubleLess(MP[0], S1)) 
           { 
            goto case 23; 
           } 
          } 
          if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            goto case 1; 
           } 
          } 
         } 
        } 
        **goto case 0;** 
       case 1: 
        if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0) && PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
        { 
+3

多かれ少なかれ、コーナーに自分自身をコーディングしたようです。あなたはあるものを入れ替え、次に他のものを入れ替えたからです。 「ケース23」を考慮すると、この機能は巨大であるように思われる。コードを分解して、このコード内の各動作について注意深く考えて、カプセル化する必要があります。これは、関連する条件に論理のアトミックビットを使用するのに役立ちます。 – zaitsman

+5

この場合の 'goto'の代わりに' switch'ブロックが何度も何度も実行される_stateマシン_があります。 'goto'は一般的に貧しいデザインの兆候であり、子猫を拷問するのが好きだということです) – MickyD

+1

時間の経過と共に基準変数が変わるように聞こえます。 case 0の場合:goto case 0はループです。あなたはリファクタリングをwhileループにすることを考えましたか? – Assaf

答えて

1

スイッチをwhileループで囲み、次に "どこにでも"配置する必要があります。

if(CurrentPosition.Value != 0){ 
     while (location > -1) { 
      switch(location) 
      { 

       case 0: 
        if(criteria1 && criteria2) 
        { 
         LimitLongsPT.Send(S1 + ((R1 - S1) * BuffZone)); 
         LongStopSA.Send(S1 - StopAmount); 
         ShortStopDeep.Send(R1 + StopAmount); 
         TradeManager.ProcessEvents(); 
         if(activated == true) 
         { 
          if(PublicFunctions.DoubleEquals(CurrentPosition.Value, 0)) 
          { 
           location = -1; 
           break; 
          } 
          if(PublicFunctions.DoubleLess(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], S1) && PublicFunctions.DoubleLess(MP[0], R1)) 
           { 
            location = 15; 
            break; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            location = 16; 
            break; 
           } 
           if(PublicFunctions.DoubleGreater(MP[0], S2) && PublicFunctions.DoubleLess(MP[0], S1)) 
           { 
            location = 23; 
            break; 
           } 
          } 
          if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0)) 
          { 
           if(PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
           { 
            location = 1; 
            break;; 
           } 
          } 
         } 
        } 
        location = 0; 
        break; 
       case 1: 
        if(PublicFunctions.DoubleGreater(CurrentPosition.Value, 0) && PublicFunctions.DoubleGreater(MP[0], R1) && PublicFunctions.DoubleLess(MP[0], R2)) 
        { 

私はこのような大きな混乱を避けてもう少し平らにしていますが、それが必要な場合は、おそらくState Machineを見てください。

関連する問題