¿Cómo contar las apariciones de un char\string dentro de una cadena?

Resuelto Ian G asked hace 15 años • 35 respuestas

Quiero contar cuántos /mensajes pude encontrar en una cadena. Hay varias formas de hacerlo, pero no pude decidir cuál es la mejor (o la más fácil).

Por el momento voy con algo como:

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

O para cadenas donde la longitud > 1:

string haystack = "/once/upon/a/time";
string needle = "/";
int needleCount = ( haystack.Length - haystack.Replace(needle,"").Length ) / needle.Length;
Ian G avatar Feb 12 '09 22:02 Ian G
Aceptado

Si está utilizando .NET 3.5, puede hacer esto en una sola línea con LINQ:

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

Si no quieres usar LINQ puedes hacerlo con:

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

¡Te sorprenderá saber que tu técnica original parece ser aproximadamente un 30% más rápida que cualquiera de estas! Acabo de hacer una prueba comparativa rápida con "/once/upon/a/time/" y los resultados son los siguientes:

Su original =
fuente de 12 segundos. Cuenta =
fuente de 19 segundos. División = 17 segundos
para cada uno ( de la respuesta de bobwienholt ) = 10 segundos

(Los tiempos son para 50.000.000 de iteraciones, por lo que es poco probable que notes mucha diferencia en el mundo real).

LukeH avatar Feb 12 '2009 16:02 LukeH
string source = "/once/upon/a/time/";
int count = 0;
foreach (char c in source) 
  if (c == '/') count++;

Tiene que ser más rápido que el source.Replace()propio.

bobwienholt avatar Feb 12 '2009 16:02 bobwienholt
int count = new Regex(Regex.Escape(needle)).Matches(haystack).Count;
Yet Another Code Maker avatar Dec 10 '2010 15:12 Yet Another Code Maker