2009-10-10 12 views
14

jestem konwersji kodu Java do C# i znaleźli kilka znakowanych „break” oświadczenia (np)istnieje odpowiednik oznaczonego przerwie Java w C# lub obejście

label1: 
    while (somethingA) { 
     ... 
     while (somethingB) { 
      if (condition) { 
       break label1; 
      } 
     } 
    } 

Czy istnieje odpowiednik w C# (aktualny odczyt nie wskazuje), a jeśli nie jest jakaś konwersja inny niż (powiedzmy) posiadające flagi bool aby wskazać, czy przerwać na każdym końcu pętli (np)

bool label1 = false; 
while (somethingA) 
{ 
    ... 
    while (somethingB) 
    { 
     if (condition) 
     { 
      label1 = true; 
      break; 
     } 
    } 
    if (label1) 
    { 
     break; 
    } 
} 
// breaks to here 

byłbym zainteresowany, dlaczego C# robi nie ma tego, ponieważ nie wydaje się być bardzo złe.

Odpowiedz

24

Możesz po prostu użyć goto, aby przejść bezpośrednio do etykiety.

while (somethingA) 
{ 
    // ... 
    while (somethingB) 
    { 
     if (condition) 
     { 
      goto label1; 
     } 
    } 
} 
label1: 
    // ... 

w języku C-podobne, goto często kończy się środek czyszczący do zerwania zagnieżdżonej pętli, w przeciwieństwie do śledzenia zmiennych logicznych i wielokrotnie sprawdzanie ich na końcu każdej pętli.

+0

@ Mark podziękowania, nie zdawałem sobie sprawy, że C# jest dozwolone. –

+7

Nie ma za co. Nie zdawałem sobie sprawy, że Java ma etykietowane instrukcje, co czyni nas równymi: P –

+3

"Zwrot" jest bardziej przejrzysty, jeśli można go tak ukształtować. –

1

Refaktoryzacja jest najlepszą odpowiedź, jeśli masz wystarczająco dużo złożoności funkcji, które są potrzebne, aby wyrwać się z dwóch takich pętli:

Na przykład ta zbieranina kodu:

List<List<Item>> listOfLists; 

//Merges lists if they are adjacent until only one is left. 
void MergeAdjacentListsUntilOneIsLeft() 
{ 
    while(listOfLists.Count > 1) 
    { 
     BeginIteration: 
     foreach(List<Item> list in listOfLists) 
     { 
      foreach (Item item in list) 
      { 
       foreach(List<Item> otherList in listOfLists) 
       { 
        if(list.IsAdjacentTo(otherList)) 
        { 
         list.AddRange(otherList); 
         listOfLists.Remove(otherList); 
         goto BeginIteration; 
        } 
       } 
      } 
     } 
    } 
} 

Staje:

List<List<Item>> listOfLists; 

//Merges two lists if they are adjacent. 
void MergeIteration() 
{ 
    foreach(List<Item> list in listOfLists) 
    { 
     foreach (Item item in list) 
     { 
      foreach(List<Item> otherList in listOfLists) 
      { 
       if(list.IsAdjacentTo(otherList)) 
       { 
        list.AddRange(otherList); 
        listOfLists.Remove(otherList); 
        return; 
       } 
      } 
     } 
    } 
} 

//Does it until only one is left. 
void MergeAdjacentListsUntilOneIsLeft() 
{ 
    while(listOfLists.Count > 1) 
    { 
     MergeIteration();   
    } 
} 
Powiązane problemy