Chaine de caractere, comptage occurence

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





 






 
A voir également:

10 réponses

krimog
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
51
24 févr. 2009 à 09:48
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()) ;
6
RougailSaucisse
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
24 févr. 2009 à 10:20
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
1
Le plus simple et le plus rapide est d'utiliser les requêtes Linq :
chaine.Count(n => n == 'c')
1
francouas
Messages postés
16
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
21 décembre 2009

24 févr. 2009 à 10:52
Merci bien.
Me voilà avec 2 versions différentes et 2 fois plus de connaissances

je reviendrais !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
25 févr. 2009 à 08:39
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-
0
krimog
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
51
25 févr. 2009 à 11:00
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()) ;
0
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
25 févr. 2009 à 13:40
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-
0
krimog
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
51
25 févr. 2009 à 14:20
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()) ;
0
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
25 févr. 2009 à 22:20
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-
0
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
25 févr. 2009 à 22:28
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-
0