2016-01-06 443 views
2

我剛剛開始工作,在工作日結束時,我通過慢慢閱讀我們的代碼庫來等待流量。我遇到了這一點,即使在白板上花了相當長的時間,我依然想不到一種方法來提取goto。有沒有辦法消除這種跳躍?我該如何擺脫這個goto?

public void MyUpdate(MyType foo) 
{ 
    /*Prep code for the loops*/   
    foreach (Thing bar in something) 
    { 
     foreach (Collection item in bar.Stuff) 
     { 
      Data dataRX = item.First; 
      if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID)) 
      { 
       // Update Data with the latest changes 
       dataRX.fooBuddy = foo; 
       goto exitLoops; 
      } 
     } 
    } 

    exitLoops: ; 
} 
+3

爲什麼不'return'如果'exitLoops'是在方法的結束? –

+0

@YacoubMassad好主意,但在某些編碼標準中,從一個函數中的多個位置返回''''會被認爲是不好的形式,如goto。 –

+1

我更喜歡'return'解決方案。上面提到的代碼標準也不像我的答案那樣喜歡「break」。但我認爲這些標準往往是非常理論化的,在這種情況下不應該被認爲是嚴肅的。 –

回答

6

由於標籤exitLoops是在方法結束,那麼你可以簡單地使用return退出方法是這樣的:

if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID)) 
{ 
    // Update Data with the latest changes 
    dataRX.fooBuddy = foo; 
    return; 
} 

另一種方法是使用這樣的標誌:

bool done = false; 

foreach (Thing bar in something) 
{ 
    foreach (Collection item in bar.Stuff) 
    { 
     Data dataRX = item.First; 
     if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID)) 
     { 
      // Update Data with the latest changes 
      dataRX.fooBuddy = foo; 
      done = true; 
      break; 
     } 
    } 

    if(done) 
     break; 
} 

即使標籤後面有一些代碼,也可以使用第二種方法。

+1

現在你指出了,「返回」似乎非常明顯。 exitLoops標籤之後過去有很多空白空間,我敢打賭在這個函數中曾經有過更多的代碼。謝謝。 – HireThisMarine

3

將內部循環移到方法中,並根據其返回值有條件地中斷。

2

這不是那麼好,但沒有實現一個完整的新算法,這似乎是最簡單的方法:

foreach (Thing bar in something) 
{ 
    bool exitLoop = false; 
    foreach (Collection item in bar.Stuff) 
    { 
     Data dataRX = item.First; 
     if (dataRX != null && dataRX.ID.Equals(globalNonsense.ID)) 
     { 
      // Update Data with the latest changes 
      dataRX.fooBuddy = foo; 
      exitLoop = true; 
      break; 
     } 
    } 

    if (exitLoop) break; 
} 
1

或者,您也可以做到這一點使用LINQ:

public void MyUpdate(MyType foo) 
{ 
    Thing dummy = something.FirstOrDefault(bar => bar.Stuff.SkipWhile((item) => 
    { 
     Data dataRx = item.First; 
     if (dataRx != null && dataRx.ID.Equals(globalNonsense.ID)) 
     { 
      dataRx.fooBuddy = foo; 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
    }).Count() != 0); 
}