woot6768
Messages postés393Date d'inscriptionmercredi 8 mars 2006StatutMembreDernière intervention23 mars 2007
-
14 juin 2006 à 15:35
salamprc
Messages postés2Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention 9 juillet 2008
-
9 juil. 2008 à 22:13
Salut à tous,
J'ai un problème avec les propriétés 'Left' et 'Right' que je sais coder en VB, mais pas moyen de trouver la syntaxe C#. Mon coded est le suivant :
for each motRejete
in rejetsDim x As Integer
Dim ok As Boolean
ok =
true
while (ok)x = InStr(1,
" " & chaîne &
" ",
" " & motRejete &
" ");
if (x > 0) Thenchaîne = Left(chaîne, x - 1) & Right(chaîne, chaîne.Length - x - motRejete.Length + 1) /*C'est donc sur cette ligne que ce situe mes soucis avec 'left' et 'right'*/
elseok =
false
end if
wend
Est-ce que quelqu'un saurait comment coder ceci en c#?
Merci
_________________________________________________________________________
Woot Alias Wouter Tjon.
dgouttegattat
Messages postés129Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention30 décembre 20073 14 juin 2006 à 18:08
- Le 'x' de ton code, qui représente la position du mot dans la chaîne, correspond à 'index' dans le mien. En y repensant, je conviens que ce n'était pas très judicieux de ma part de changer le nom des variables, mais il se trouve que j'ai l'habitude, quand j'utilise IndexOf(), d'appeler la variable 'index'.
- 's' est simplement une chaîne de caractères quelconque, ce morceau-là c'était pour t'illustrer le fonctionnement de Substring() et d'IndexOf().
- Effectivement,
<hr />chaine = chaine.Substring(0, x) + chaine.Substring(x + motRejete.Length);<hr />
est censée faire exactement la même chose que
<hr />chaine = Left(chaine, x - 1) & Right(chaine, chaine.Length - x - motRejete.Length + 1)<hr />
En effet, chaine.Substring(0, x) retourne le morceau de la chaîne compris entre le premier caractère et le caractère à la position x (non-inclus), et chaine.Substring(x + motRejete.Length) retourne le morceau de la chaîne compris entre le caractère à la position x + motRejete.Length et la fin de la chaîne.
La version suivante de mon code est peut-être plus simple à comprendre pour toi, car elle est plus proche de la version VB :
<hr />foreach (string motRejete in rejets)
{
bool ok = true;
int x = 0;
while (ok)
{
x = chaine.IndexOf(motRejete);
if (x > -1)
{
chaine = chaine.Substring(0, x) + chaine.Substring(x + motRejete.Length);
}
else
{
ok = false;
}
}
}<hr />
Dans ma première réponse, j'avais utilisé une syntaxe beaucoup plus concise, habituelle pour ceux qui codent en C++/C#/Java, mais peut-être déroutante pour les utilisateurs de VB... Mea maxima culpa.
Si ça peut te rassurer, j'ai déjà essayé de transposer du code que j'avais écrit en C# vers du VB.NET et je n'ai guère mieux réussi que toi !
cs_Bidou
Messages postés5486Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 14 juin 2006 à 15:53
Salut,
Je crois que C# n'a pas d'équivalent direct pour les méthodes Left et Right. Tu es obligé d'utiliser la méthode SubString.
C'est un peu plus long à faire, mais quelques lignes font l'affaire.
cs_Bidou
Messages postés5486Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 14 juin 2006 à 15:56
Pour ce qui est de InStr, ça correspond assez bien à la méthode IndexOf (de la class String donc bien sûr)
Enfin, d'après ce que j'ai pu lire dans la doc en tout cas...
woot6768
Messages postés393Date d'inscriptionmercredi 8 mars 2006StatutMembreDernière intervention23 mars 2007 14 juin 2006 à 16:27
Je crois que l'on ne ce comprend pas bien, le 'InStr' a pour but de convertir le int 'x' en une 'string', si c'est ce que tu as voulu montrer, j'en suis alors désolé car j'ai pas compris.
_________________________________________________________________________
Woot Alias Wouter Tjon.
dgouttegattat
Messages postés129Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention30 décembre 20073 14 juin 2006 à 16:29
Salut,
En C#, tu peux utiliser la méthode Substring du type String pour mimer l'action de Left et Right :
<hr />string s = "that is a test";
string leftPart = s.Substring(0, 8); // les 8 premiers caractères de la chaîne
string rightPart = s.Substring(8); // tout ce qui reste après le 8ème caractère<hr />
Pour InStr, tu peux utiliser la méthode IndexOf() :<hr />int index s.IndexOf("is"); // index 5<hr />
Donc un moyen de traduire ton code en C# est de faire quelque chose comme :
<hr />foreach (string motRejete in rejets)
{
int index = 0;
while ((index = chaine.IndexOf(motRejete)) > 0)
{
chaine = chaine.Substring(0, index) + chaine.Substring(index + motRejete.Length);
}
}<hr />
Note qu'un moyen plus simple et sans doute plus efficace consiste à passer par un StringBuilder :
<hr />StringBuilder sb = new StringBuilder(chaine);
foreach (string motRejete in rejets)
{
sb.Replace(motRejete, String.Empty); // remplacer motRejete par une chaîne vide
}
chaine = sb.toString();
<hr />
dgouttegattat
Messages postés129Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention30 décembre 20073 14 juin 2006 à 16:36
InStr ne convertit rien, elle renvoie simplement la position d'une chaine de caractères au sein d'une autre. C'est exactement ce que fait String.IndexOf().
Au passage, il y a une coquille dans le code que je t'ai donné ci-dessus : IndexOf renvoie -1 si elle ne trouve pas d'occurence, donc dans la condition du while, il faut tester index > -1 et non index > 0.
woot6768
Messages postés393Date d'inscriptionmercredi 8 mars 2006StatutMembreDernière intervention23 mars 2007 14 juin 2006 à 17:07
Salut dgouttegattat,
Je suis désolé mais je ne comprend rien à ton exemple, cela a-t-il encor quelque chose à voir avec le code d'origine, ou c'est juste un exemple comme ça?
_________________________________________________________________________
Woot Alias Wouter Tjon.
dgouttegattat
Messages postés129Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention30 décembre 20073 14 juin 2006 à 17:26
Je reconnais que ça ne ressemble plus du tout à ton code, mais pourtant il doit faire exactement la même chose. À moins que je n'ai pas compris ton code dès le départ ? Ce ne serait pas très étonnant vu mon niveau en VB...
Pour être sûr, voilà ce que j'ai compris : tu veux supprimer d'une chaîne de caractères tous les mots qui sont présents dans une liste de "mots à rejeter".
woot6768
Messages postés393Date d'inscriptionmercredi 8 mars 2006StatutMembreDernière intervention23 mars 2007 14 juin 2006 à 17:36
Oui exact!
Mais en faite ce que je ne comprend pas dans ton exemple sont les points suivants :
-Où est passé mon 'x'?
-Que représente ton 's'(string')?
-Ta ligne : (chaine = chaine.Substring(0, index)
+chaine.Substring(index + motRejete.Length);),
fait elle la même chose que ça : chaîne = Left(chaîne, x - 1) & Right(chaîne, chaîne.Length - x - motRejete.Length + 1) ?
-Et pour finir, ben tu auras remarqué que je n'ais en faite rien compris...
_________________________________________________________________________
Woot Alias Wouter Tjon.
woot6768
Messages postés393Date d'inscriptionmercredi 8 mars 2006StatutMembreDernière intervention23 mars 2007 15 juin 2006 à 10:06
Alors là, que dire à par MERCI dgouttegattat !!!
Explications très claire, compréhensible...Niquel quoi.
Merci de m'avoir enlever cette épine qui me faisait F**t*****t mal.
_________________________________________________________________________
Woot Alias Wouter Tjon.
salamprc
Messages postés2Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention 9 juillet 2008 9 juil. 2008 à 22:13
En fait les fonction Left, Right, Mid peuvent être utiliser dans C# sans les implenter de nouveau.
on ajoute l'entête : using Microsoft.VisualBasic ;
puis pour les opérations sur les chaînes de caractères on utilise Strings.<Membre> avec Membre un des membres de la classe Strings (Left, Right, Trim, Mid...).