Wie man die Anzahl der Vorkommen eines Zeichens oder einer Teilzeichenfolge in einem String in C# zählt: 5 Methoden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie oft kommt der Buchstabe „a“ im Wort „abrakadabra“ vor? Wir lösen die Aufgabe in C#



Stellen Sie sich vor: Sie schreiben einen Log-Analysator, parsen eine CSV-Datei oder überprüfen einfach, wie oft der Benutzer das @-Zeichen in einer E-Mail eingegeben hat. Die Aufgabe „die Anzahl der Vorkommen eines Zeichens oder einer Teilzeichenfolge in einem String zählen“ ist eine derjenigen, die in jedem zweiten Projekt vorkommt. Auf Stack Overflow hat diese Frage Tausende von Aufrufen und Dutzende von Antwortvarianten gesammelt. Kein Wunder: In C# gibt es mindestens 5 verschiedene Methoden, und die richtige Wahl kann Stunden des Debuggens sparen.



In diesem Artikel werden wir alle gängigen Methoden durchgehen – von der klassischen Schleife bis hin zu modernen Span<T> und LINQ. Sie erfahren, welche Methode schneller, welche lesbarer und welche besser nicht in der Produktion verwendet werden sollte. Los geht's!



1. Klassische foreach-Schleife – die Altbewährte



Die intuitivste Methode: Nehmen Sie den String, durchlaufen Sie jedes Zeichen und zählen Sie die Übereinstimmungen. Funktioniert immer, erfordert keine zusätzlichen Bibliotheken.



string text = "abrakadabra";char target = 'a';int count = 0;

foreach (char c in text){ if (c == target) count++;}

Console.WriteLine($"Das Zeichen '{target}' kommt {count} Mal vor."); // Ausgabe: 4


Vorteile: Lesbarkeit, Kontrolle über den Prozess, Logik kann hinzugefügt werden (z. B. Groß-/Kleinschreibung ignorieren).
Nachteile: Nicht geeignet zum Zählen von Teilzeichenfolgen (mehrere aufeinanderfolgende Zeichen) – dafür müsste man eine verschachtelte Schleife schreiben.



2. Die Count()-Methode aus LINQ – Einzeiler für Zeichen



Wenn Sie prägnanten Code mögen und LINQ verwenden, ist diese Variante für Sie. Die Methode Count() akzeptiert ein Prädikat und gibt die Anzahl der Elemente zurück, die die Bedingung erfüllen.



using System.Linq;

string text = "Hello, World!";char target = 'l';

int count = text.Count(c => c == target);Console.WriteLine(count); // Ausgabe: 3


Beachten Sie: Count() ist eine Erweiterungsmethode aus dem Namespace System.Linq. Wenn Sie using System.Linq nicht eingebunden haben, wird der Code nicht kompiliert.



Zum Zählen einer Teilzeichenfolge ist diese Methode nicht direkt geeignet. Sie müssten den String erst aufteilen oder reguläre Ausdrücke verwenden (siehe Punkt 5).



3. Span<T> und MemoryExtensions – maximale Leistung



Wenn Sie mit großen Strings arbeiten (Megabyte an Logs) und jede Millisekunde zählt, vergessen Sie LINQ. Verwenden Sie Span<char> und die Methode Count() aus MemoryExtensions (verfügbar ab .NET 5+).



using System;

string text = "abrakadabra";ReadOnlySpan<char> span = text.AsSpan();int count = span.Count('a');

Console.WriteLine(count); // Ausgabe: 4


Warum ist das schnell? Span<T> arbeitet mit zusammenhängenden Speicherblöcken, ohne neue Objekte zu allozieren. Die Methode Count() in MemoryExtensions ist für SIMD-Instruktionen optimiert – sie verarbeitet 16-32 Zeichen pro CPU-Takt.



Für Teilzeichenfolgen gibt es auch eine Lösung:



int count = span.Count("ra"); // zählt die Vorkommen der Teilzeichenfolge "ra"Console.WriteLine(count); // Ausgabe: 2 ("abrakadabra" enthält "ra" zweimal)


Wichtig: Diese Methode unterscheidet zwischen Groß- und Kleinschreibung. Wenn die Groß-/Kleinschreibung ignoriert werden soll, bringen Sie den String zuerst auf eine einheitliche Schreibweise oder verwenden Sie span.Count("ra", StringComparison.OrdinalIgnoreCase).



4. Split-Methode – ein cleverer Trick für Teilzeichenfolgen



Eine alte, aber funktionierende Methode: Teilen Sie den String an der gesuchten Teilzeichenfolge und zählen Sie die Anzahl der Teile minus eins.



string text = "eins, zwei, drei, eins, vier";string target = "eins";

int count = text.Split(target, StringSplitOptions.None).Length - 1;Console.WriteLine(count); // Ausgabe: 2


Wie funktioniert das? Split

Blogs

Buchempfehlungen