Entwickler-Ecke
Basistechnologien - ForEach Schleife mit Switch-Case abbrechen
TheSoul - Do 04.11.10 11:49
Titel: ForEach Schleife mit Switch-Case abbrechen
Hallo zusammen
Ich habe eine Switch-Case Anweisung in einer ForEach-Schleife. Wenn ein Case ausgeführt wird, gibt es ein "break". Dieser "break" bewirkt aber nur, dass es aus dem Switch ausspringt.
Gibt es eine Möglichkeit, wenn ein Case ausgeführt wird, die Foreach Schleife abzubrechen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| foreach ( string roleId in arrayIdRoles) { switch (Convert.ToInt32(roleId)) { case 1: liBen.Visible = true; liPla.Visible = true; liOE.Visible = true; break; case 2: liBen.Visible = true; liPla.Visible = true; liOE.Visible = false; break; case 3: liBen.Visible = true; liPla.Visible = false; liOE.Visible = false; break;
default: break; } } |
Danke im Voraus für eure Hilfe
Yogu - Do 04.11.10 13:09
Du kannst in den case-Zweigen eine bool'sche Variable setzen, die besagt, ob die Schleife abgebrochen werden soll. Nach der switch-Anweisung wertest du diese aus und führst ggf. ein break aus.
TheSoul - Do 04.11.10 15:17
Danke für die Antworten!
Meine Lösung:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| bool stoploop = false; foreach ( string roleId in arrayIdRoles) { if (!stoploop) { switch (Convert.ToInt32(roleId)) { case 1: liBen.Visible = true; liPla.Visible = true; liOE.Visible = true; stoploop = true; break; case 2: liBen.Visible = true; liPla.Visible = true; liOE.Visible = false; stoploop = true; break; case 3: liBen.Visible = true; liPla.Visible = false; liOE.Visible = false; stoploop = true; break;
default: break; } } } |
Funktioniert soweit ganz gut.
Das Programm wird nun erweitert, sollte später komplizierter werden. Also möglich, dass diese eher "unsaubere" Lösung verändert werden muss.
@Greenberet: Danke für den Hinweis!
Kha - Do 04.11.10 16:21
Greenberet hat folgendes geschrieben : |
Bitte jetzt keine Diskussionen über das "böse Wort" |
Oh doch, denn normalerweise suchen wir eher nach lesbarem als mikrooptimiertem Code. Und wen wirklich die zusätzliche Variable stört, der greife zur imo sowieso schöneren Lösung: Den switch-Block in eine neue Methode auslagern und darin
return benutzen.
Irgend ein Beispiel müssen sie ja angeben :P .
Greenberet - Do 04.11.10 16:53
[quote="
Kha"(622706)]
Greenberet hat folgendes geschrieben : |
Bitte jetzt keine Diskussionen über das "böse Wort" |
Oh doch, denn normalerweise suchen wir eher nach lesbarem als mikrooptimiertem Code. Und wen wirklich die zusätzliche Variable stört, der greife zur imo sowieso schöneren Lösung: Den switch-Block in eine neue Methode auslagern und darin
return benutzen.
Also das Goto unlesbar ist...ist aus einer Zeit wo man noch aus funktionen rausspringen konnte. In C# ist man an die aktuelle Methode gebunden, mit anderen Worten: Goto ist in C# lesbar ;). Wäre es auch in C/C+ wenn mans richtig verwenden würd.
Die Goto Variante ist halt das Gegenstück zu den labeled Loops in Java.
Btw. das Beispiel mit der Funktion am besten gleich wieder streichen. Spätestens bei Verschachtelung im 4ten Grad ist die lesbarkeit mit den Funktionen bei 0.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!