Blöde Frage zu If … Then

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Translating-IT.

    Blöde Frage zu If … Then

    Hi,

    mal so ne ganz blöde Frage zu If-Then-Zeilen:

    Wenn ich jetzt eine If Then habe, bei der mehrere And- oder Or-Einschränkungen vorkommen; kann man die evtl. optimieren, wenn es dieselbe Variable ist, die sich ändert, anstatt das ständig wiederholen zu müssen?

    Beispiel:

    1) If int_zahl = 1 Or int_zahl = 2 Or int_zahl = 7 then
    2) If (int_zahl = 1 Or int_zahl = 2) And str_wort = "Hallo" then


    würde zu:

    1) If int_zahl = (1 Or 2 Or 7) then
    2) If int_zahl = (1 Or 2) And str_wort = "Hallo" then

    Das wäre doch viel effizienter und kürzer.


    Ich habe dazu nichts gefunden, aber vielleicht habe ich das ja auch nur übersehen.

    Edit auf Anfrage.

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Translating-IT“ ()

    Ich hab mir mal vor langer Zeit eine Extension dafür gemacht. Ähnlich dem, was Dksksm verlinkt hat:

    VB.NET-Quellcode

    1. <Extension> Public Function IsOneOf(Of T)(Thing As T, ThingCollection As IEnumerable(Of T)) As Boolean
    2. Return ThingCollection.Contains(Thing)
    3. End Function

    Dann kannst Du schreiben:
    If int_zahl.IsOneOf({1, 5, 10}) Then

    dazu 2 Anmerkungen:
    - Extensions müssen in ein Public Module
    - int_zahl ist eine Variante von Hungarian notation und nicht mehr zeitgemäß
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Translating-IT Setze zunächst mal Klammern in Deiner zweiten Codezeile, damit absolut klar ist, wohin das And gehört.
    Dann: Statt Or nimm OrElse, statt And nimm AndAlso.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Dksksm und @VaporiZed Cool, danke. Das ist, was ich meine. Also an sich kann man es eleganter (kürzer) lösen.

    @VaporiZed Deine Extension schaut nach

    VB.NET-Quellcode

    1. if (new int[] { 1, 2, 3, 4, 5 }.Contains(value))

    aus, wie im Link von Dksksm zu finden. Würde somit schon existieren und
    müsste nicht extra neu erstellt werden, oder habe ich da was übersehen?

    - public Module ist kein Problem
    -
    Hungarian Notation ist für mich viel übersichtlicher, da ich da nicht
    lange überlegen muss, welche meiner variable ich jetzt wo einsetzen
    kann, vor allem wenn ich unterschiedliche Variablen mit gleichem Namen
    benötige, die jeweils integer, String, usw. enthalten. Verboten ist sie
    ja nicht. Schau mir aber natürlich gerne andere Schreibweisen an, wenn
    sie mir weiterhelfen. (hab eh schon die Wiki-Seite dazu aufgerufen) Was
    wäre sonst zu empfehlen?

    @RodFromGermany Erledigt.

    VB.NET-Quellcode

    1. OrElse
    und

    VB.NET-Quellcode

    1. AndAlso
    muss ich mir noch anschauen, sind mir bisher nicht untergekommen.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    Zum einen: Der Unterschied zwischen And und AndAlso/Or und OrElse
    zum anderen:

    Translating-IT schrieb:

    Deine Extension schaut nach [dem] aus, wie im Link von Dksksm zu finden. Würde somit schon existieren und müsste nicht extra neu erstellt werden, oder habe ich da was übersehen?
    Nun, klar, Du kannst immer wieder das schreiben:
    If (new int[] { 1, 2, 3, 4, 5 }.Contains(value)) ThenIst aber doch ein wenig kompliziert/lang
    oder Du nutzt Extensions und schreibst nur kurz
    If value.IsOneOf({1, 2, 3, 4, 5}) Then
    Es geht ja nur darum, dass man sich es nicht unnötig kompliziert machen muss oder eben Vereinfachungen einbaut, wo welche sinnvoll sind, weil sie häufig verwendet werden. Ich habe eine große Liste von Extension, die mir das Leben ein gutes Stück einfacher machen.
    Oder ich versteh Deine Bemerkung nicht und Du meinst was komplett anderes.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    If (new int[] { 1, 2, 3, 4, 5 }.Contains(value)) Then Ist aber doch ein wenig kompliziert/lang
    lässt sich doch auch noch kürzen
    ​If { 1, 2, 3, 4, 5 }.Contains(value) Then
    Oder täusche ich mich? Ich habe gerade kein Studio zur Hand.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja, geht. Ja, es ist manchmal auch Geschmackssache, ob man eine Extension verwendet oder nicht. Ich finde, dass, wenn in meinem Code steht If value.IsOneOf({1, 2, 3, 4, 5}) Then (oder eben If value.IsOneOf(1, 2, 3, 4, 5) Then, wenn man mit ParamArray arbeitet) es besser lesbar und für mich leichter verständlich ist als die anderen Codekomplikationen. Darum geht es mir in meinem Code: leichte Verständlich- und Lesbarkeit.
    … wenn man mal davon absieht, dass If (new int[] { 1, 2, 3, 4, 5 }.Contains(value)) Then C# und VB.NET vermischt - shame on me.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Meinte damit nicht, dass Extension zu schreiben falsch wäre, sondern nur, dass Du scheinbar was geschrieben hast, was so auch schon möglich ist. ;) Aber stimmt, Deins ist etwas kürzer zum Schreiben. So, werde mir nun mal die anderen Kommentare mit Vorschlägen genauer anschauen.

    Edit: wie verhält sich OrElse nun zu diesem Szenario, z. B. verglichen mit Vaporizeds Extension?
    OrElse ist (wenn ich es richtig verstanden habe) verglichen mit Or optimierter, da es nicht weiter prüft, wenn eines zutrifft. Somit hätte Optimierung (effizienter) vor Codelänge/Übersichtlichkeit? Oder gibt es für OrElse auch so ne Art Extension, um alles abzukürzen?

    Gibt es eigentlich auch eine Verkürzung der And-Variante bzw. AndAlso?
    z. B.:
    If str_var = 1 And str_var2 = 2 And str_var3 = 1 then
    würde zu
    if (str_var1 And str_var2 And str_var3) = 1 then

    Edit2: @VaporiZed Die Extension vergleicht alles, oder steigt sie auch mittendrin aus (wie OrElse), wenn eines zutrifft?

    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Translating-IT“ ()

    Translating-IT schrieb:

    Meinte damit nicht, dass Extension zu schreiben falsch wäre, sondern nur, dass Du scheinbar was geschrieben hast, was so auch schon möglich ist.
    Dassis sone Sache.
    Manchmal schreibt man eine Super-schlaue Extension, und im nächsten Framework-Update kommt Microsoft mit derselben Idee daher, und man selbst ist obsolet.

    Translating-IT schrieb:

    OrElse ist (wenn ich es richtig verstanden habe) verglichen mit Or optimierter, da es nicht weiter prüft, wenn eines zutrifft. Somit hätte Optimierung (effizienter) vor Codelänge/Übersichtlichkeit?
    Naja - 'Optimieren' sollte man erstmal genau definieren.
    Ich definiere 'Optimierung' als eine Verbesserung in einer Hinsicht, die durch eine Verschlechterung in anderer Hinsicht erkauft ist.
    Wenn also eine 'Optimierung' keine Zusatz-Kosten verursacht, dann isses keine 'Optimierung', sondern einfach der bessere Code.
    Und den anderen Code sollte man schlicht lassen.
    Konkret: Or ist einfach schlechter als OrElse.
    Gut - der 'Vorteil' von Or ist, dasses 5 Zeichen kürzer ist, aber das ist nu wirklich kein ausschlaggebendes Argument.

    Translating-IT schrieb:

    Gibt es eigentlich auch eine Verkürzung der And-Variante bzw. AndAlso?
    Guck dir die .Any() - und .All() - Extensions der Enumerable-Klasse an.
    .Any() - würde ich sagen - repräsentiert eine Oder-Verknüpfung, und .All() repräsentiert And.
    Beide sind natürlich als "shortcirquit" implementiert,

    also Any bricht ab (und returnt true), sobald ein Element die Bedingung erfüllt,
    und All bricht ab (und returnt false), sobald gegen die Bedingung verstossen wird.

    Also genaugenommen .Any() repräsentiert eine OrElse-Verknüpfung, und .All() repräsentiert AndAlso.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    der 'Vorteil' von Or ist, dasses 5 Zeichen kürzer ist
    falsche Taste erwischt? Ich zähl nur 4.

    Translating-IT schrieb:

    Die Extension vergleicht alles, oder steigt sie auch mittendrin aus (wie OrElse), wenn eines zutrifft?
    siehe Post#4. Da ich keine Ahnung habe, wie Contains() funktioniert, da es eine Framework-Funktion ist, kann ich es Dir nicht sagen. Wird aber wahrscheinlich gut optimiert worden sein. Aber damit bin ich schon wieder am Spekulatiusessen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.