【问题标题】:C# repeating a specific case in a switchC# 在 switch 中重复特定情况
【发布时间】:2016-10-13 08:55:00
【问题描述】:

我有一堆开关在里面。我需要代码一次停留在一个案例中,直到满足特定标准,然后我想告诉它要转到哪个案例。我目前有自己的情况,这不会导致错误,但确实会导致我正在使用的程序不断加载并且永远不会执行。

我需要满足的条件是 bool 语句“已激活”,在此之前我希望代码保留在案例中。

缺少很多代码,因此可能没有意义,但我想知道是否有更好的方法来做到这一点。

另外,在你问之前,我还是个初学者,我知道每个人都讨厌 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))
                    {

【问题讨论】:

  • 或多或少看起来你已经在角落里编码了自己;因为你打开一件事,然后 if...else 在另一件事上;考虑到“案例 23”,这个功能似乎也是巨大的。您需要分解您的代码并仔细考虑您在此代码中的每个行为,以便您可以封装它。这将有助于在相关条件下使用原子逻辑。
  • 在这种情况下,goto 的替代方案是 状态机,其中switch 块会随着时间的推移多次执行。 goto 通常表示设计不佳,并且您喜欢折磨小猫;)
  • 这里的标准变量听起来会随着时间而变化。 case 0: goto case 0 是一个循环。您是否考虑过重构为 while 循环?
  • 感谢您的回复,我确实忘记提及了,但 Assaf 做到了。随着时间的推移,条件会得到满足,它是一个我无法控制的不断变化的变量,是的,开关中有 32 个案例。我使用 while 循环开始此操作,但无法使其正常工作。我将研究这个“状态机”。再次感谢。

标签: c# switch-statement


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多