Problem mit Operatoren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Problem mit Operatoren

    Hi :)

    ich hab ein kleines Problem mit den Operatoren, das ich nicht verstehe:

    VB.NET-Quellcode

    1. If (AktuelleMP3Info.Interpret.ToLower.Contains("feat.") = False) Or (AktuelleMP3Info.Interpret.ToLower.Contains("ft.") = False) Then
    2. If Eintrag.Interpret.ToLower.Contains("feat.") Then
    3. MeinInterpret = AktuelleMP3Info.Interpret & " " & Eintrag.Interpret.Substring(Eintrag.Interpret.ToLower.IndexOf("feat."))
    4. ElseIf Eintrag.Interpret.ToLower.Contains("ft.") Then
    5. MeinInterpret = AktuelleMP3Info.Interpret & " " & Eintrag.Interpret.Substring(Eintrag.Interpret.ToLower.IndexOf("ft."))
    6. Else
    7. MeinInterpret = AktuelleMP3Info.Interpret
    8. End If
    9. Else
    10. ...


    Und zwar wird Zeile 2 ausgeführt, obwohl in Zeile 1 AktuelleMP3Info.Interpret.ToLower.Contains("ft.") = True ist (s. Screenshot)... Habs auch schon mit Not AktuelleMP3Info.Interpret.ToLower.Contains("ft.") versucht, da ist das Gleiche...

    Es sollen Zeile 2-8 nur ausgeführt werden, wenn entweder "ft." oder "feat." nicht in AktuelleMP3Info.Interpret.ToLower enthalten ist...
    Bilder
    • screenshot 20231029.png

      76,01 kB, 1.506×277, 59 mal angesehen

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

    Aber Not AktuelleMP3Info.Interpret.ToLower.Contains("feat.") trifft doch zu. Daher trifft die Gesamtbedingung zu. Du musst daher nicht Or, sondern AndAlso nutzen:
    "Wenn der Interpret nicht ft. enthält und nicht feat. enthält, dann"

    "nicht A und nicht B" = weder A noch B -> Wenn Interpret weder ft. noch feat. enthält, dann

    Der Unterschied zwischen And und AndAlso/Or und OrElse

    ##########

    kafffee schrieb:

    Es sollen Zeile 2-8 nur ausgeführt werden, wenn entweder "ft." oder "feat." nicht in AktuelleMP3Info.Interpret.ToLower enthalten ist...
    Das würde aber bedeuten: Z#2-8 sollen nicht ausgeführt werden, wenn im String weder ft. noch feat. steht, also "Metallica". Oder wenn beides enthalten ist, also "Metallica ft. Eminem feat. Heino"

    Wenn dem so ist, verwende Xor: Dann trifft die Bedingung zu, wenn nur eine Seite erfüllt ist. Aber dann kannst Du auch gleich das Not weglassen. Schreib also prinzipiell: If Interpret.Contains("ft.") Xor Interpret.Contains("feat.")
    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.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    kafffee schrieb:

    VB.NET-Quellcode

    1. If (AktuelleMP3Info.Interpret.ToLower.Contains("feat.") = False) Or (AktuelleMP3Info.Interpret.ToLower.Contains("ft.") = False) Then
    kannst Du vollständig weglassen, weil Du in diesem Zweig alle denkbaren Einzelfälle betrachtest:

    VB.NET-Quellcode

    1. MeinInterpret = AktuelleMP3Info.Interpret
    2. If Eintrag.Interpret.ToLower.Contains("feat.") Then
    3. MeinInterpret &= " " & Eintrag.Interpret.Substring(Eintrag.Interpret.ToLower.IndexOf("feat."))
    4. ElseIf Eintrag.Interpret.ToLower.Contains("ft.") Then
    5. MeinInterpret &= " " & Eintrag.Interpret.Substring(Eintrag.Interpret.ToLower.IndexOf("ft."))
    6. End If
    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!
    Nein, da der erste Teil des Blocks (If Eintrag.Interpret.ToLower.Contains("feat.") Then) dann auch abgearbeitet wird, wenn Metallica ft. Eminem feat. Heino zusammenkommen, was ja anscheinend ausgeschlossen werden soll.
    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.
    Okay und wie ist das hiermit:

    VB.NET-Quellcode

    1. If ((Eintrag.Interpret.Contains(ZuErsetzendeMP3INfo.Interpret)) Or (ZuErsetzendeMP3INfo.Interpret.Contains(Eintrag.Interpret))) AndAlso (Not DateienListe.Contains(Eintrag)) AndAlso (Eintrag.Album = ZuErsetzendeMP3INfo.Album) Then


    Hier soll der Code ausgeführt werden, wenn Eintrag.Interpret ZuersetzendeMP3Info.Interpret enthält oder genau andersrum und zusätzlich darf Eintrag nicht in DateienListe enthalten sein und das Album muss übereinstimmen. Also wenn das eine Eminem ist und das andere Eminem feat. Heino oder andersrum oder aber wenn beides Eminem ist soll ausgeführt werden.

    Ziel ist es, alle aus Eintrag rauszubekommen, die im gleichen Album sind und dabei aber auch Features im Interpretenstring zulassen und nicht nur wenn der Interpret exakt übereinstimmt.

    Beim aktuellen Setup werden dabei nur die zugelassen, die kein Feature haben.

    Eintrag ist dabei ein Eintrag in der gesamten Liste aller Tracks, und ZuErsetzendeMP3Info stellt einen beliebigen Track aus dieser Liste dar.

    Ich versteh das nicht, dann müsste es doch auch so gehen wie beim ursprünglichen Problem aus Post #1...? Also wenn das eine zutrifft oder das andere oder beides??

    VB.NET-Quellcode

    1. If ((Eintrag.Interpret.Contains(ZuErsetzendeMP3INfo.Interpret)) AndAlso (ZuErsetzendeMP3INfo.Interpret.Contains(Eintrag.Interpret))) AndAlso (Not DateienListe.Contains(Eintrag)) AndAlso (Eintrag.Album = ZuErsetzendeMP3INfo.Album) Then

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

    kafffee schrieb:

    Also wenn das eine zutrifft oder das andere oder beides
    Das ist ein einfaches OrElse.
    Aber Dein letzter Codevorschlag kann ja nur gutgehen, wenn Eintrag.Interpret = ZuErsetzendeMP3INfo.Interpret, sonst trifft ja eine Contains-Bedingung nicht zu.
    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:

    Aber Dein letzter Codevorschlag kann ja nur gutgehen, wenn Eintrag.Interpret = ZuErsetzendeMP3INfo.Interpret, sonst trifft ja eine Contains-Bedingung nicht zu.


    Ja genau das scheint das Problem zu sein.

    Ich dachte eigentlich, dass wenn

    Eintrag.Interpret = "Eminem" und ZuErsetzendeMP3Info.Interpret = "Eminem feat. Heino"

    dann

    ZuErsetzendeMP3Info.Contains(Eintrag.Interpret) = True

    Oder bin ich da auf dem Holzweg? Wie würdest du das machen?

    Edit: Ah du meinst mit AndAlso :)

    Hab das jetzt probehalber mal so gemacht:

    VB.NET-Quellcode

    1. If SaveMetaTextToAllFiles Then
    2. For Each Eintrag In MainModule.InhaltGesamt
    3. If (Eintrag.Interpret.Contains(ZuErsetzendeMP3INfo.Interpret)) AndAlso (Not DateienListe.Contains(Eintrag)) AndAlso (Eintrag.Album = ZuErsetzendeMP3INfo.Album) Then
    4. ErmittleRichtigenInterpret(Eintrag, DateienListe)
    5. ElseIf (ZuErsetzendeMP3INfo.Interpret.Contains(Eintrag.Interpret)) AndAlso (Not DateienListe.Contains(Eintrag)) AndAlso (Eintrag.Album = ZuErsetzendeMP3INfo.Album) Then
    6. ErmittleRichtigenInterpret(Eintrag, DateienListe)
    7. End If


    Aber der überspringt immer noch die mit Features drin... Komisch oder?


    Edit2: AAAAAAAAAAh hab den Fehler, der lag woanders :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kafffee“ ()

    Ja, das passt ja auch. Aber Du hast ja noch die zweite Bedingung, die das Ganze nahezu unmöglich macht: Eintrag.Interpret.Contains(ZuErsetzendeMP3Info)

    kafffee schrieb:

    Wie würdest du das machen?
    Da ich durch Deine Datenstrukturen derzeit nicht durchblicke und ich noch nicht mal genau weiß, was Du anstrebst, bin ich raus. Vielleicht klappt es morgen wieder mit dem Verständnis.
    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.
    Da beide Bedingungsblöcke zur gleichen Anweisung führen, könntest Du diese nun auch mit einem OrElse verknüpfen:

    VB.NET-Quellcode

    1. If (Eintrag.Interpret.Contains(ZuErsetzendeMP3INfo.Interpret)) AndAlso (Not DateienListe.Contains(Eintrag)) AndAlso (Eintrag.Album = ZuErsetzendeMP3INfo.Album) OrElse (ZuErsetzendeMP3INfo.Interpret.Contains(Eintrag.Interpret)) AndAlso (Not DateienListe.Contains(Eintrag)) AndAlso (Eintrag.Album = ZuErsetzendeMP3INfo.Album) Then


    wenn man das etwas vereinfacht anschaut, bekommt man:

    VB.NET-Quellcode

    1. If A AndAlso B AndAlso C OrElse D AndAlso B AndAlso C Then

    Das geht einfacher. Da OrElse wie ein mathematisches + ist und AndAlso wie ein x, bekommst Du
    A x B x C + D x B x C
    Du kannst B x C ausklammern:
    B x C x (A + D)
    also

    VB.NET-Quellcode

    1. If B AndAlso C AndAlso (A OrElse D) Then

    also

    VB.NET-Quellcode

    1. If (Not DateienListe.Contains(Eintrag)) AndAlso (Eintrag.Album = ZuErsetzendeMP3INfo.Album) AndAlso ((Eintrag.Interpret.Contains(ZuErsetzendeMP3INfo.Interpret)) OrElse (ZuErsetzendeMP3INfo.Interpret.Contains(Eintrag.Interpret))) Then


    ist schon ein Brocken. Wenn es um kompakten Code geht, lass es so.
    Ich würd sowas in ne Methode verfrachten und Ausschlusskriterien zu Beginn schreiben:

    VB.NET-Quellcode

    1. Sub FallsRelevantDannErmittleRichtigenInterpret(Eintrag As Whatever, DateienListe As IEnumerable(Of Whatever2))
    2. If DateienListe.Contains(Eintrag) Then Return
    3. If Eintrag.Album <> ZuErsetzendeMP3INfo.Album Then Return
    4. If Not Eintrag.Interpret.Contains(ZuErsetzendeMP3INfo.Interpret) Then Return
    5. If Not ZuErsetzendeMP3INfo.Interpret.Contains(Eintrag.Interpret) Then Return
    6. ErmittleRichtigenInterpret(Eintrag, DateienListe)
    7. End Sub

    Ja, jede Bedingung einzeln, damit jede für sich spricht und das für mich klarer wäre, also eine "komplizierte" Verknüpfung aller.
    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.
    an dieser Stelle würde ich mal einen Kommentar befürworten, der korrekt! erklärt, was da eiglich passieren soll. Weil

    VB.NET-Quellcode

    1. If (Not DateienListe.Contains(Eintrag)) AndAlso (Eintrag.Album = ZuErsetzendeMP3INfo.Album) AndAlso ((Eintrag.Interpret.Contains(ZuErsetzendeMP3INfo.Interpret)) OrElse (ZuErsetzendeMP3INfo.Interpret.Contains(Eintrag.Interpret))) Then
    ist mir vollständig unleserlich.