Warum die normale .Contains()-Methode Sie im Stich lässt (und wie Sie das beheben)
\n\nStellen Sie sich vor: Sie schreiben eine Suche für einen Buchkatalog in C#. Der Benutzer gibt „Tolstoi“ ein, aber in der Datenbank steht „tolstoi“ in Kleinbuchstaben. Die normale string.Contains("Tolstoi")-Methode gibt false zurück. Ein bekanntes Problem? Diese Frage hat auf Stack Overflow tausende Aufrufe erhalten – und das zu Recht. Im Jahr 2025, wo .NET leistungsstarke Werkzeuge für die Arbeit mit Zeichenketten bietet, bedeutet die Verwendung des alten Ansatzes, Benutzer und Leistung zu verlieren.
In diesem Artikel analysieren wir die 5 besten Methoden, um .Contains() in C# groß-/kleinschreibungsunabhängig zu machen. Sie erfahren, welche Methode Sie für maximale Geschwindigkeit wählen und welche für die korrekte Arbeit mit verschiedenen Sprachen. Los geht's!
Das Problem: Warum ist .Contains() standardmäßig groß-/kleinschreibungsabhängig?
\n\nIn C# verwendet die Methode string.Contains() standardmäßig einen Ordinal-Vergleich. Das bedeutet, dass Zeichen byteweise verglichen werden: 'A' (0x41) ist nicht gleich 'a' (0x61). Für englischsprachige Inhalte ist das oft in Ordnung, aber in mehrsprachigen Anwendungen (Russisch, Deutsch, Türkisch) zerbricht dieser Ansatz die Suchlogik.
Zum Beispiel ist im Türkischen der Großbuchstabe von 'i' 'İ', nicht 'I'. Ein einfaches ToLower() kann ein falsches Ergebnis liefern. Daher ist es eine schlechte Praxis, einfach text.ToLower().Contains(pattern.ToLower()) aufzurufen. Schauen wir uns moderne Lösungen an.
Methode 1: StringComparison.OrdinalIgnoreCase – Ihr neuer Standard
\n\nAb .NET 5 (und hervorragend funktionierend in .NET 8/9) ist der schnellste und sicherste Weg, die Überladung von Contains mit dem Parameter StringComparison zu verwenden:
string text = "Krieg und Frieden – Lew Tolstoi";\nstring searchTerm = "tolstoi";\n\nbool result = text.Contains(searchTerm, StringComparison.OrdinalIgnoreCase);\nConsole.WriteLine(result); // True\n\nWarum ist das die beste Wahl?
\n- \n
- Geschwindigkeit: OrdinalIgnoreCase arbeitet auf Byte-Ebene, ignoriert aber die Groß-/Kleinschreibung. Es ist 2-3 Mal schneller als CurrentCultureIgnoreCase. \n
- Vorhersagbarkeit: Es ist unabhängig von der Kultur des Benutzers. "ß" (deutsches Eszett) wird nicht mit "ss" gleichgesetzt, wenn Sie das nicht möchten. \n
- Unterstützung: Verfügbar in allen modernen .NET-Versionen (Core 2.1+). \n
Verwenden Sie diese Methode, wenn Sie einen einfachen Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung benötigen und nicht mit sprachlichen Besonderheiten (Sortierung, Deklination) arbeiten.
\n\nMethode 2: IndexOf() mit StringComparison – wenn Sie mehr Kontrolle benötigen
\n\nManchmal müssen Sie nicht nur das Vorhandensein prüfen, sondern auch die Position des Vorkommens ermitteln. Oder Sie arbeiten mit älteren Versionen des .NET Frameworks, in denen Contains mit StringComparison nicht vorhanden ist. Dann hilft IndexOf() weiter:
string text = "C# – die beste Sprache für Backend";\nstring searchTerm = "Beste";\n\nbool result = text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0;\nConsole.WriteLine(result); // True\n\n// Und wenn Sie die Position benötigen:\nint index = text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase);\nConsole.WriteLine(index); // 4 (Position, an der das Wort beginnt)\n\nWann verwenden:
\n- \n
- In Legacy-Projekten (z. B. .NET Framework 4.x). \n
- Wenn Sie den Index des Vorkommens finden müssen, nicht nur das Vorhandensein prüfen. \n
- Für komplexere Szenarien (z. B. Suche mit Zeichenüberspringen). \n
Wichtig: IndexOf gibt -1 zurück, wenn die Teilzeichenfolge nicht gefunden wird. Prüfen Sie immer auf >= 0, nicht auf > 0.
Methode 3: CultureInfo.CurrentCultureIgnoreCase – für sprachlich korrekte Suche
\n\nWenn Ihre Anwendung die