Chaine de caractere, comptage occurence [Résolu]

francouas 16 Messages postés mardi 24 février 2009Date d'inscription 21 décembre 2009 Dernière intervention - 24 févr. 2009 à 09:40 - 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 

10 réponses

Répondre au sujet
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 24 févr. 2009 à 09:48
+2
Utile
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()) ;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
RougailSaucisse 118 Messages postés lundi 16 février 2009Date d'inscription 6 décembre 2010 Dernière intervention - 24 févr. 2009 à 10:20
+1
Utile
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
francouas 16 Messages postés mardi 24 février 2009Date d'inscription 21 décembre 2009 Dernière intervention - 24 févr. 2009 à 10:52
0
Utile
Merci bien.
Me voilà avec 2 versions différentes et 2 fois plus de connaissances

je reviendrais !
Commenter la réponse de francouas
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 févr. 2009 à 08:39
0
Utile
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
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 25 févr. 2009 à 11:00
0
Utile
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 févr. 2009 à 13:40
0
Utile
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
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 25 févr. 2009 à 14:20
0
Utile
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 févr. 2009 à 22:20
0
Utile
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 févr. 2009 à 22:28
0
Utile
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
Utile
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.