web-dev-qa-db-fra.com

Nombre d'occurrences d'un caractère dans une chaîne

J'essaie d'obtenir le nombre d'occurrences d'un certain caractère tel que & dans la chaîne suivante.

string test = "key1=value1&key2=value2&key3=value3";

Comment puis-je déterminer qu'il y a 2 esperluettes (&) dans la variable de chaîne de test ci-dessus?

91

Vous pourriez faire ceci:

int count = test.Split('&').Length - 1;

Ou avec LINQ:

test.Count(x => x == '&');
211
Michael Frederick

Parce que LINQ peut tout faire ...:

string test = "key1=value1&key2=value2&key3=value3";
var count = test.Where(x => x == '&').Count();

Ou si vous le souhaitez, vous pouvez utiliser la surcharge Count prenant un prédicat:

var count = test.Count(x => x == '&');
25
gdoron

Le plus simple, et le plus efficace, serait simplement de parcourir les caractères de la chaîne:

int cnt = 0;
foreach (char c in test) {
  if (c == '&') cnt++;
}

Vous pouvez utiliser les extensions Linq pour créer une version plus simple et presque aussi efficace. Il y a un peu plus de frais généraux, mais les performances restent étonnamment proches:

int cnt = test.Count(c => c == '&');

Ensuite, il y a l'ancien truc Replace, mais il convient mieux aux langages où la boucle est maladroite (SQL) ou lente (VBScript):

int cnt = test.Length - test.Replace("&", "").Length;
12
Guffa

Pourquoi utiliser regex pour cela. String implémente IEnumerable<char>, vous pouvez donc utiliser simplement LINQ.

test.Count(c => c == '&')
9
Brian Rasmussen

Votre exemple de chaîne ressemble à la partie de chaîne de requête d'un GET. Si oui, notez que HttpContext a de l'aide pour vous

int numberOfArgs = HttpContext.Current.QueryString.Count;

Pour en savoir plus sur ce que vous pouvez faire avec QueryString, voir NameValueCollection

8
payo

Voici le moyen le plus inefficace d'obtenir le décompte dans toutes les réponses. Mais vous obtiendrez un dictionnaire contenant des paires clé-valeur en prime.

string test = "key1=value1&key2=value2&key3=value3";

var keyValues = Regex.Matches(test, @"([\w\d]+)=([\w\d]+)[&$]*")
                     .Cast<Match>()
                     .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);

var count = keyValues.Count - 1;
6
L.B