Find in List Of() Case Sensitive

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Find in List Of() Case Sensitive

    Guten Tag,

    wieder einmal ist es Zeit für eine Wochenendfrage.

    Ich benutze immer lieber List (Of T) um meine Objekte zu speichern, zu suchen, zu filter.
    Jetzt ist mir aber aufgefallen, dass die Suche in einer List Of nach Strings Case Sensitive ist.

    Als Beispiel;

    VB.NET-Quellcode

    1. Dim Item As ThisProgram.Obj.UserStatus.Item = Lst.Items.Find(Function(F) F.Name Like "Angemeldet")


    Item wäre Nothing, wenn Find nichts zurückgibt. Find gibt aber auch nichts zurück, wenn Name Like "angemeldet" ist.

    Derzeit löse ich dies mit

    VB.NET-Quellcode

    1. Dim Item As ThisProgram.Obj.UserStatus.Item = Lst.Items.Find(Function(F) Strings.LCase(F.Name) Like Strings.LCase("Angemeldet"))


    Funktioniert soweit, allerdings finde ich es auf Dauer zu aufwändig, in jeder Suche das Strings.LCase schreiben zu müssen.

    Im Gegenzug ist das Case Sensitive im Find aber auch hilfreich, wenn ich genau einen passenden String (Passwort z.B.) suche, wobei auf Groß- und Kleinschreibung geachtet werden soll.

    Als Alternative könnte ich eine Funktion erstellen, welche mir in kürzerer Schreibweise den String durch LCase/UCase jagt und diese an Stelle von Strings.LCase vor den String setze.

    Wie löst ihr das?

    Ich wünsche ein schönes Wochenende :)
    Das Ganze hat weder was mit einer List(Of) noch mit LINQ zu tun. Eine Stringsuche ist standardmäßig immer case-sensitive, daher musst Du entsprechende Umbauten auch immer einbauen.
    btw: Du kannst auch F.Name.ToLower() und "Angemeldet".ToLower() verwenden. Und: Gibt es einen Grund für Like? In diesem konkreten Beispiel ist ein = sinnvoller.
    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.
    Hey. Solltest Du die Suche an mehreren verschiedenen Stellen benötigen, so empfehle ich Dir dafür eine Extension anzulegen. Z. B. so.

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim list As New List(Of User)
    5. Dim item As User = list.FindX("angemeldet")
    6. End Sub
    7. End Class
    8. Public Class User
    9. Public Property Name As String
    10. End Class
    11. Public Module Extensions
    12. <Extension()>
    13. Public Function FindX(source As List(Of User), name As String) As User
    14. Return source.Find(Function(x) x.Name.ToLower() = name.ToLower())
    15. End Function
    16. End Module


    Anstatt .ToLower() kannst Du auch String.Compare() nutzen. Mir fällt jedoch auf, dass Du hier nach "angemeldet" suchst. Das sieht für mich nach einem gewissen "User-Status" aus. Hier würde ich ein Enum anstatt String nutzen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    VB.NET-Quellcode

    1. Option Compare Text
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Console.WriteLine("A" = "a") '=> True
    5. Console.WriteLine("A" Like "a") '=> True
    6. End Sub
    7. End Class
    docs.microsoft.com/en-us/dotne…/option-compare-statement

    BlueLagoonX schrieb:

    Allerdings wird damit auch die Case Sensitivität von abgefragten Passwörtern bzw. Hashes aufgehoben.
    Das Option Compare Text gilt nur für die Datei, in der das steht.
    Wenn Du mit Partial Class Deine Klasse auf mehrere Dateien verteilst, kannst Du das für jede Datei nach Deinen Bedürfnissen vorgeben.
    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!