switch-case oder doch 15 x if?
-
@Knuddelbaer: Dictionary<int, Delegate> oder sowas?
-
die frage lässt auch einigermaßen viel interpretationsspielraum zu.
int werte[15] = { 1, 7, 23 ... } for(int i=0; i < 15; ++i) { if(var == werte[i]) { do(i); } }
-
@Styler3
und wie findest du in der do funktion heraus was i gerade ist
Da hat man dann doch das gleiche Problem.
Zudem wäre es bei oder switch einfacher zu erweitern.
-
@Styler3
Also da wäre ja selbst noch die if/else-if Verschachtelung schneller und einfacher als das mit einer Schleife UND if zu lösen...
-
Klar, das ist aber kein Array mehr sondern eine map von einem Value auf eine Aktion. (Was ich z.B. machen würde wenn mir die switch zu groß wird.)
@styler
Das es zu viel Spielraum für Interperation gibt lasse ich gelten. Dennoch könnte man foreach verwenden oder Array<int>.IndexOf , schaut eleganter aus und man überlasst es dem Framework den Wert zu suchen.
-
at_styler schrieb:
und wie findest du in der do funktion heraus was i gerade ist
keine ahnung. muss ich das denn?
at_styler schrieb:
Zudem wäre es bei oder switch einfacher zu erweitern.
wieso? du musst doch nur das array um einen wert erweitern (und die 15 nicht hardcoden. und wenn man schon mal dabei ist, das vergessene break nachtragen).
und switch funktioniert doch in c# auch nur mit konstanten, oder? der OP schreibt leider nicht, ob es konstanten sind.JustSomeCoder schrieb:
Also da wäre ja selbst noch die if/else-if Verschachtelung schneller
theoretisch vielleicht. in der praxis wird es nur wenige fälle geben, wo der unterschied tatsächlich eine rolle spielt.
und einfacher als das mit einer Schleife UND if zu lösen...
sehe ich nicht so. 15 ifs hintereinander sehen nicht gerade übersichtlich im code aus. switch wäre schon besser, falls es um konstanten geht. kommt halt drauf an, was der OP überhaupt genau macht.
Knuddlbaer schrieb:
Dennoch könnte man foreach verwenden oder Array<int>.IndexOf , schaut eleganter aus und man überlasst es dem Framework den Wert zu suchen.
ja gut, man muss die schleife bzw. suche natürlich nicht selbst programmieren, wenn die bibliothek oder sprache sowas hergibt. das prinzip bleibt das gleiche.
-
Manchmal gibt es Situationen, wo man ein "if-else if" verwenden muss, z.B. in einem Bootloader für einen Mikrocontroller. Der Bootloader muss unbedingt 100% aus dem RAM laufen, und da der Compiler für ein "switch-case" unter Umständen irgendeinen optimierten Code aus einer Library einsetzt, die im Flash steht und nicht ins RAM ausgelagert werden kann...
-
Da wir hier im C# .Net Code sind können wir davon ausgehen, das die Sprache entsprechende Konstrukte beherrscht und die Anforderung von abc nicht erfüllt werden kann.
Ich denke der Op ausreichend Möglichkeiten gefunden hat. Welche nun für sei Problem am besten passt ist, wie styler bereits mehrmals schreib, mangels Informationen nicht zu sagen.
-
Da wir hier im C# .Net Code sind können wir davon ausgehen
Oh Entschuldigung, ist ja ein C# .Net Forum, mein Posting bezieht sich natürlich auf C... wie gesagt, war spät gestern...
-
abc.w schrieb:
Manchmal gibt es Situationen, wo man ein "if-else if" verwenden muss, z.B. in einem Bootloader für einen Mikrocontroller. Der Bootloader muss unbedingt 100% aus dem RAM laufen, und da der Compiler für ein "switch-case" unter Umständen irgendeinen optimierten Code aus einer Library einsetzt, die im Flash steht und nicht ins RAM ausgelagert werden kann...
Abgesehen davon dass das mit C# nun wirklich nichts zu tun hat... hängt es ganz vom Compiler ab wann und wo Runtime-Library Funktionen verwendet werden. Ein Compiler könnte genauso eine "if-else" Orgie "erkennen", einen Baum draus machen, und eine Runtime-Library-Funktion verwenden um den Baum zu "parsen". Hättest du wieder dasselbe Problem.