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?
Vous pourriez faire ceci:
int count = test.Split('&').Length - 1;
Ou avec LINQ:
test.Count(x => x == '&');
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 == '&');
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;
Pourquoi utiliser regex pour cela. String
implémente IEnumerable<char>
, vous pouvez donc utiliser simplement LINQ.
test.Count(c => c == '&')
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
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;