Prüfen ob String einen der Werte (Bla) hat

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von SAR-71.

    Prüfen ob String einen der Werte (Bla) hat

    Kurze Frage, eigentlich ziemlich leicht und ich bin mir sicher ich könnte das auch mit If oder SelectCase lösen.
    Aber nun zur Frage:

    Warum funktioniert das nicht:

    VB.NET-Quellcode

    1. If feed = "1" Or "2" Or "3" Or "4" Or "5" Then
    2. TextBox1.Text = ""
    3. MsgBox("Danke für dein Feedback!", 0 + 48, "Danke")
    4. Else
    5. MsgBox("Bitte bewerte von 1-5 (bestes 5)!", 0 + 48, "Fehler")
    6. TextBox1.Text = ""
    7. End If


    Auch wenn ich die Zahl 6 eingebe kommt 'Danke für dein Feedback!'.
    Woran liegt das ? (Ist wahrscheinlich mal wieder mein mangelndes Verständnis für 'Or', 'AndAlso' und so weiter :D)
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Eistee hat (mal wieder) Recht :)
    Danke, hätte ich auch einfach durch ausprobieren drauf kommen können.

    Kann mir nun noch jem. erklären warum das so (mit dem ständigen 'feed = ') nötig ist ?
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    weil du or nur boolesche werte verknüpfen kann. Jedoch ist "1" oder "2" kein boolescher wert.
    Jedoch feed = "1" ist ein solcher wert da dies true oder false ist.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Danke, erledigt :)
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Option Strict Off?

    Meine These:
    "2", "3", etc. wird implizit in Integer konvertiert,
    Diese Integerwerte werden Or-verknüpft (2 = 10, 2 = 11, 4 = 100, alles Or = 111),
    Anschließend wird der feed (der von welchem Typ ist?) mit dem resultierenden Integer verglichen.

    Option Strict On ist hier ein Muss!

    Eistee hat die Lösung schon gepostet und Rinecamo hat die Verbesserung gepostet.

    Und auch ich gebe meinen Senf dazu:
    Wenn feed vom Typ String ist:

    VB.NET-Quellcode

    1. Dim Ratings As String() = {"1", "2", "3", ....}
    2. '...
    3. If Ratings.Contains(feed) Then
    4. 'Danke fürs Feedback
    5. Else
    6. 'Falsche Eingabe
    7. End If
    8. [vb]
    9. Wenn feed vom Typ Integer ist:
    10. [vb]
    11. If feed >= 2 AndAlso feed <= 5 Then
    12. 'Danke
    13. Else
    14. 'Fehler
    15. End If


    Edit: Ach ich bin langsam
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    AliveDevil schrieb:

    ich nur mit einem Contains.

    Wie ist die Contains-Funktion wohl aufgebaut? Schätze eine Schleife die abbricht, wenn das Item gefunden wurde.

    Schleife kann man auch als viele OrElses lösen, ist aber wirklich nicht elegant, an der Performance ändert das nahezu nichts.

    @SAR-71: Nur, wenn man die Ors als Ors drin lässt, bei OrElse überprüft er ja nicht weiter, wenn eins schon True ergeben hat.
    | Keine Fragen per PN oder Skype.
    Zeitangabe in Ticks, da bei "vergangene MilliSekunden" verständlicherweise immer 0 als Ergebnis ausgegeben wird.

    Or Or Or Or ....
    9 Ticks

    feed = Integer mit > und <=
    3 Ticks

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eistee“ ()

    mein Bescheidener Test:
    Contains String

    VB.NET-Quellcode

    1. Public checkedList As String() = New String() {"1", "2", "3", "4", "5"}
    2. For x = 0 To 100
    3. sw.Start()
    4. If checkedList.Contains(value) Then
    5. Console.Write("Found in ")
    6. Else
    7. Console.Write("Didnt found in ")
    8. End If
    9. sw.Stop()
    10. Console.WriteLine(sw.ElapsedTicks)
    11. sw.Reset()
    12. Next

    mittel: 849,6

    Or

    VB.NET-Quellcode

    1. Dim val2 As Integer = 4
    2. For x = 0 To 100
    3. sw.Start()
    4. If val2 = 1 Or val2 = 2 Or val2 = 3 Or val2 = 4 Or val2 = 5 Then
    5. Console.Write("Found in ")
    6. Else
    7. Console.Write("Didnt found in ")
    8. End If
    9. sw.Stop()
    10. Console.WriteLine(sw.ElapsedTicks)
    11. sw.Reset()
    12. Next

    Mittel: 812,7

    OrElse

    VB.NET-Quellcode

    1. Dim val2 As Integer = 4
    2. For x = 0 To 100
    3. sw.Start()
    4. If val2 = 1 OrElse val2 = 2 OrElse val2 = 3 OrElse val2 = 4 OrElse val2 = 5 Then
    5. Console.Write("Found in ")
    6. Else
    7. Console.Write("Didnt found in ")
    8. End If
    9. sw.Stop()
    10. Console.WriteLine(sw.ElapsedTicks)
    11. sw.Reset()
    12. Next

    Mittel: 853,8

    Range

    VB.NET-Quellcode

    1. Dim val2 As Integer = 4
    2. For x = 0 To 100
    3. sw.Start()
    4. If val2 >= 1 AndAlso val2 <= 5 Then
    5. Console.Write("Found in ")
    6. Else
    7. Console.Write("Didnt found in ")
    8. End If
    9. sw.Stop()
    10. Console.WriteLine(sw.ElapsedTicks)
    11. calc += sw.ElapsedTicks
    12. sw.Reset()
    13. Next

    Mittel: 922,99

    Alle Angaben in Ticks und ohne Gewähr.
    Informationen zu meinem System in meinem Profil.
    Ich habe mir auch mal einen Vergleich erlaubt:

    "Schlechte" Version:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sw As New Stopwatch
    2. sw.Start()
    3. Dim feed As Integer = 6
    4. If feed = "1" Or "2" Or "3" Or "4" Or "5" Then
    5. Else
    6. End If
    7. sw.Stop()
    8. Console.WriteLine(sw.ElapsedTicks)
    9. Console.Read()

    Ergebnis: 280 Ticks


    "Gute" Version:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sw As New Stopwatch
    2. sw.Start()
    3. Dim feed As Integer = 6
    4. If feed = 1 OrElse 2 OrElse 3 OrElse 4 OrElse 5 Then
    5. Else
    6. End If
    7. sw.Stop()
    8. Console.WriteLine(sw.ElapsedTicks)
    9. Console.Read()

    Ergebnis: 7 Ticks


    Das Ganze auch mit Contains:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sw As New Stopwatch
    2. sw.Start()
    3. Dim feed As String = "6"
    4. Dim Ratings() As String = {"1", "2", "3", "4", "5"}
    5. If Ratings.Contains("6") Then
    6. Else
    7. End If
    8. sw.Stop()
    9. Console.WriteLine(sw.ElapsedTicks)
    10. Console.Read()

    Ergebnis: 280 Ticks


    Das Ganze mit only Zahlen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sw As New Stopwatch
    2. sw.Start()
    3. Dim feed As Integer = 6
    4. Dim Ratings() As Integer = {1, 2, 3, 4, 5}
    5. If Ratings.Contains(6) Then
    6. Else
    7. End If
    8. sw.Stop()
    9. Console.WriteLine(sw.ElapsedTicks)
    10. Console.Read()

    Ergebnis: 7061 Ticks ?!


    Und nochmal keine Array-Array gebilde:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sw As New Stopwatch
    2. sw.Start()
    3. Dim feed As String = "6"
    4. Dim Ratings As String = "12345"
    5. If Ratings.Contains("6") Then
    6. Else
    7. End If
    8. sw.Stop()
    9. Console.WriteLine(sw.ElapsedTicks)
    10. Console.Read()

    Ergebnis: 54 Ticks






    Ein Unterschied von 273 Ticks! zwischen den "Hauptvergleichen"
    Ein paar Ergebnisse haben mich ziemlich überrascht. :D



    Mfg.
    SAR