¿Cómo contar las apariciones de un char\string dentro de una cadena?
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;
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).
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.
int count = new Regex(Regex.Escape(needle)).Matches(haystack).Count;