1064 Stimmen

Wie würden Sie das Vorkommen einer Zeichenkette (eigentlich eines Zeichens) innerhalb einer Zeichenkette zählen?

Ich mache gerade etwas, bei dem ich merke, dass ich zählen möchte, wie viele / s, die ich in einer Zeichenkette finden konnte, und dann fiel mir auf, dass es mehrere Möglichkeiten gab, aber ich konnte mich nicht entscheiden, welche die beste (oder einfachste) war.

Im Moment denke ich an so etwas wie:

string source = "/once/upon/a/time/";
int count = source.Length - source.Replace("/", "").Length;

Aber es gefällt mir überhaupt nicht, hat jemand Lust?

Ich möchte nicht wirklich etwas ausgraben. RegEx oder doch?

Ich weiß, dass meine Zeichenfolge den gesuchten Begriff enthalten wird, also können Sie davon ausgehen, dass...

Natürlich auch für Streicher wobei Länge > 1 ,

string haystack = "/once/upon/a/time";
string needle = "/";
int needleCount = ( haystack.Length - haystack.Replace(needle,"").Length ) / needle.Length;

1226voto

LukeH Punkte 251752

Wenn Sie .NET 3.5 verwenden, können Sie dies in einem Einzeiler mit LINQ tun:

int count = source.Count(f => f == '/');

Wenn Sie LINQ nicht verwenden möchten, können Sie dies mit tun:

int count = source.Split('/').Length - 1;

Sie werden vielleicht überrascht sein, dass Ihre ursprüngliche Technik etwa 30 % schneller ist als diese beiden! Ich habe gerade einen schnellen Benchmark mit "/once/upon/a/time/" durchgeführt und die Ergebnisse sind wie folgt:

Ihr Original = 12s
Quelle.Count = 19s
Quelle.Split = 17s
foreach ( aus der Antwort von bobwienholt ) = 10s

(Die Zeiten beziehen sich auf 50.000.000 Iterationen, so dass Sie in der Praxis wahrscheinlich keinen großen Unterschied feststellen werden).

214voto

bobwienholt Punkte 17040
string source = "/once/upon/a/time/";
int count = 0;
foreach (char c in source) 
  if (c == '/') count++;

Muss schneller sein als die source.Replace() von selbst.

154voto

int count = new Regex(Regex.Escape(needle)).Matches(haystack).Count;

91voto

mqp Punkte 66863

Wenn Sie nach ganzen Zeichenketten und nicht nur nach Zeichen suchen möchten:

src.Select((c, i) => src.Substring(i))
    .Count(sub => sub.StartsWith(target))

Lies als "für jedes Zeichen in der Zeichenkette, nimm den Rest der Zeichenkette ab diesem Zeichen als Teilzeichenfolge; zähle es, wenn es mit der Zielzeichenkette beginnt".

79voto

LINQ funktioniert mit allen Sammlungen, und da Strings nur eine Sammlung von Zeichen sind, wie wäre es mit diesem netten kleinen Einzeiler:

var count = source.Count(c => c == '/');

Stellen Sie sicher, dass Sie using System.Linq; am Anfang Ihrer Codedatei, als .Count ist eine Erweiterungsmethode aus diesem Namensraum.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X