switch-case oder doch 15 x if?



  • Wpher kommen die Werte? Was willst du prüfen? Gehts auch mit Polymorphie?



  • Switch-Case natürlich, da hier viel mehr Informationen für den Compiler vorhanden sind als bei einer If-Anweisung (siehst du ja an den ganzen Einschränkungen die für Switch gelten).



  • Knuddlbaer schrieb:

    vernünftigerweise würde man die werte in ein array packen und mittels einer schleife drüber laufen

    😕

    was verstehst du nicht? werte? array? schleife? 🙂



  • if(var == 1)
    {
       doone();
    }
    else if(var == 2)
    {
      dootherone();
    }
    else if(var == <n>)
    {
     do<n>();
    }
    

    Es fehlt mir jetzt an Fantasie das über ein Array zu lösen.



  • @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...



  • @hustbaer

    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.


Anmelden zum Antworten