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;

                    defaultbreak;
                }
            }


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.


Greenberet - Do 04.11.10 13:26

Stichwort heißt "Goto". Bitte jetzt keine Diskussionen über das "böse Wort", es ist an dieser Stelle die einzig performante Variante, selbst in der MSDN [http://msdn.microsoft.com/en-us/library/13940fs2.aspx] werden bei dem GOTO Beispiel verschachtelte Schleifen angegeben.


Ontopic:
@The Soul: Schau dir den MSDN [http://msdn.microsoft.com/en-us/library/13940fs2.aspx] Link einfach an.


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;

                        defaultbreak;
                    }
                }
            }



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

user profile iconGreenberet hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconGreenberet hat folgendes geschrieben Zum zitierten Posting springen:
selbst in der MSDN [http://msdn.microsoft.com/en-us/library/13940fs2.aspx] werden bei dem GOTO Beispiel verschachtelte Schleifen angegeben.
Irgend ein Beispiel müssen sie ja angeben :P .


Greenberet - Do 04.11.10 16:53

[quote="user profile iconKha"(622706)]
user profile iconGreenberet hat folgendes geschrieben Zum zitierten Posting springen:
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.