Chaine de caractere, comptage occurence [Résolu]

Messages postés
16
Date d'inscription
mardi 24 février 2009
Dernière intervention
21 décembre 2009
- - Dernière réponse :  Toto - 19 janv. 2018 à 10:05
Bonjour j’aimerai écrire une fonction qui indique le nombre d'occurrences du caractère c dans la chaîne s.en C#<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>





 





Je voudrais une boucle qui examine chaque lettre et qui compte le nombre de lettres trouvées.





En theorie je sais faire mais en pratique..





 





Merci de votre aide





 






 
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
2
Merci
salut

Voilà ta fonction

int nbChar(string chaine, char lettre)
{
    int nb = 0;
    foreach (char c in chaine)
    {
        if (c == lettre) nb++;
    }
    return nb;
}

Krimog :
while (!succeed = try()) ;

Dire « Merci » 2

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de krimog
Messages postés
118
Date d'inscription
lundi 16 février 2009
Dernière intervention
6 décembre 2010
1
Merci
cette methode n'est pas meilleure que celle de krimog mais juste diférent si tu veux "kikooter" un peu ^^:

private int NbChar(string chaine, char occurence, bool invariant)
{
    if(invariant)
      return chaine.ToLowerInvariant().ToCharArray().Count(p => p == occurence);
    else
      return chaine.ToCharArray().Count(p => p == occurence);
}

Et en bonus en passant true en dernier parametre de ta fonction tu ne tiens pas compte de la casse, en passant false tu tiens compte de la casse
Commenter la réponse de RougailSaucisse
Messages postés
16
Date d'inscription
mardi 24 février 2009
Dernière intervention
21 décembre 2009
0
Merci
Merci bien.
Me voilà avec 2 versions différentes et 2 fois plus de connaissances

je reviendrais !
Commenter la réponse de francouas
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Voici ma modeste contribution...

private
int CountPattern(
string input,
string pattern,
bool invariant)
{
  
return
Regex.Matches(input, pattern, invariant ?
RegexOptions.None :
RegexOptions.IgnoreCase).Count;
}

<hr />
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
Bon bah je crois qu'on a tout fait là, non ?
Ah non, on peut Split() la chaine sur ce caractère et Count() la taille du tableau retourné :-)

Krimog :
while (!succeed = try()) ;
Commenter la réponse de krimog
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Moui, cependant c'est la première solution la meilleure en terme de performance...
Les autres (surtout la mienne) sont trop lente pour ce cas précis.

<hr />
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
Je me demande si la tienne n'est pas plus rapide dans le cas d'un très grand string. Généralement, les expressions régulières c'est assez bluffant comme perfs.

Krimog :
while (!succeed = try()) ;
Commenter la réponse de krimog
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Les regex permettent d'économiser beaucoup de ligne de code (qui peuvent être assez fastidieuses à écrire).
Si on maitrise bien la chose, on peut écrire des expressions assez complexe en très peu de caractères.

Par contre niveau performance, c'est pas forcément le pied, surtout pour les petits textes.
Avec de gros texte, en mode compiler, c'est probablement là qu'on a les meilleurs résultats mais je n'irais pas jusqu' à dire qu'on a des performances bluffantes...

Maintenant ça dépend aussi du genre de pattern qu'on utilise. Dans mon précédant message, comme je l'ai indiqué, je me base sur l'exemple poser dans la question. Et la, les regex peuvent pas faire grand chose.

<hr />
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Pour une chaîne de 200'000 caractères, sans la possibilité de mettre un bool invariant.
J'obtient ceci:

1) Boucle sur chaque char - 21'652
2) ToCharArray - 150'862
3) Regex - 1'417'887

1'000'000 de caractères

1) Boucle sur chaque char - 115'516
2) ToCharArray - 594'700
3) Regex - 4'922'910

C'est vite vu...

<hr />
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
0
Merci
Le plus simple et le plus rapide est d'utiliser les requêtes Linq :
chaine.Count(n => n == 'c')
Commenter la réponse de Toto

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.