972 votes

Comment voulez-vous compter les occurrences d'une chaîne dans une chaîne de caractères?

Je suis en train de faire quelque chose où j'ai réalisé que je voulais compter combien de /s que j'ai pu trouver dans une chaîne de caractères, et puis ça m'a frappé, qu'il y avait plusieurs façons de le faire, mais elle n'arrivait pas à se décider sur ce que les meilleurs (ou plus facile) a été.

Pour le moment, je suis aller avec quelque chose comme:

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

Mais je ne l'aime pas, tous les preneurs?

Je ne veux pas vraiment à creuser des RegEx pour cela, dois-je faire?

EDIT J'AI: Je sais que ma chaîne est le terme que je recherche, donc vous pouvez supposer que...

EDIT II: Bien sûr, pour les chaînes de longueur > 1,

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

1142voto

LukeH Points 110965

Si vous êtes en utilisant .NET 3.5, vous pouvez le faire dans un one-liner avec LINQ:

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

Si vous ne souhaitez pas utiliser LINQ, vous pouvez le faire avec:

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

Vous pourriez être surpris d'apprendre que votre technique originale semble être d'environ 30% plus rapide que l'autre de ces! Je viens de faire un rapide test avec "/une fois/sur/un/temps/", et les résultats sont comme suit:

Votre original = 12s
source.Count = 19s
source.Split = 17
foreach (à partir de bobwienholt réponse) = 10s

(Les temps sont de 50 000 000 d'itérations, donc vous avez peu de chances de remarquer une grande différence dans le monde réel).

198voto

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

A être plus rapide que la source.Remplacer les() par lui-même.

143voto

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

88voto

mquander Points 32650

Si vous voulez être en mesure de rechercher l'ensemble des chaînes, et pas seulement des personnages:

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

Lire que "pour chaque caractère de la chaîne, prendre le reste de la chaîne à partir de ce caractère comme une sous-chaîne; le comte s'il commence par la chaîne de caractères."

63voto

Judah Himango Points 27365

LINQ fonctionne sur toutes les collections, et depuis les chaînes de caractères sont simplement une collection de personnages, comment au sujet de ce joli petit one-liner:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X