Vb.Net Remplir une RichTextBox avec condition

Résolu
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 11 sept. 2016 à 22:21
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 12 sept. 2016 à 15:23
Bonjour,
c'est la première fois que je poste un sujet ici et c'est surement pas la dernière fois ( J'ai trouvé beaucoup des sujets intéressant ici)
je demande votre aide pour un problème qui parait simple pour certain (même trop simple) , je précise juste que je suis débutante :
dans le code suivant :
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim g() As Integer = {5, 8, 12, 13, 3, 4, 5, 19}
For i As Double = 0 To 30 Step 1
For a = 0 To 7 Step 1
If i <> g(a) Then
RichTextBox1.Text = RichTextBox1.Text & i & ","
End If
Next
Next
End sub

j'ai utilisé :
Dim g() As Integer = {5, 8, 12, 13, 3, 4, 19, 7}

au lieu de :
If  i = 5  Or i = 8  or i = 12 Or i = 13  Or i = 3  Or i = 4  Or i = 19  Or i = 7  then

car la liste ne contient pas que
{5, 8, 12, 13, 3, 4, 19, 7} 
elle est assez longue
Mais dans la RichTextBox sa s'affiche comme ça :
0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,
moi ce que je veux et que si la valeur de i existe dans g alors en passe a la valeur suivante, le résultat finale doit être comme ça :
0,1,2,6,9,10,11,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30
je comprend pourquoi ça s'affiche comme ça, mais je n'ai pas une idée comment corriger cette erreur
aidez-moi s'il vous plaît et merci

4 réponses

vb95 Messages postés 3418 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 31 mai 2023 165
Modifié par vb95 le 12/09/2016 à 00:55
Bonjour
Cadeau pour une débutante
 
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

Dim Liste() As Integer = {5, 8, 12, 13, 3, 4, 5, 19}
Dim Resultat as String = String.empty
For i As Integer = 0 To 30
If Liste.Contains(i) = False Then
Resultat= Resultat & i.ToString & ","
End If
Next
Resultat = Resultat.Substring(0,Resultat.Length - 1)
RichTextBox1.Text = Resultat

End Sub


- donne un nom significatif à tes variables : g() de ton code est trop vague alors que Liste() l'est beaucoup moins
- on utilise la variable Resultat et non le controle RichTextBox pour les calculs . La RichtTextBox ne sert que pour l'affichage ( il en est de même pour les autres contrôles)
- String.Empty est pour une chaine de caractères vide
- Le type Double est inutile : tu travailles sur des entiers
- Si le pas (Step) de la boucle For est = à 1 inutile de le spécifier : c'est sa valeur par défaut
- Contains : si le Liste ne contient pas i , on ajoute i à la RichTextBox
- La ligne après le Next enlève la dernière virgule

un excellent cours pour une débutante : http://plasserre.developpez.com/cours/vb-net/


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
1
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
12 sept. 2016 à 01:02
Merci pour le cadeau
je vais prendre tes remarques en considération
merci encore vb95
0
NHenry Messages postés 15069 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 mai 2023 158
11 sept. 2016 à 22:36
Rapidement, je comprend que tu ne veux conserver qu'une seule occurrence de chaque valeur, j'ai bon ?

Si j'ai bon, tu peux prendre une chaine en entrée et utiliser Split pour déparer les valeurs.
Ensuite, tu peux utiliser la fonction Distinct pour ne garder qu'une seule occurrence : MaListe.Distinct

Si tu ne veux que des nombres, voir avec un Where et un TryCast :
(Par contre, je me rappel plus de la syntaxe VB, je n'ai plus que la C# et comme je n'ai pas d'exemple sur mon PC (et Google est trop loin de ma souris))
int lTmp=0;
MaListe=MaListe.Where((pItem)=>integer.TryCast(pItem,out lTmp)).ToArray();


Pour fusionner le tout :
String.Join

Bonne recherche dans l'aide de Visual Studio pour comprendre tout ce que font ces fonctions.
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
11 sept. 2016 à 22:47
désolé mais tu m'a mal compris, par exemple
j'ai i de 0 à 2000 et g() as integer {5,8,9,13,19,26,67,131,168,... etc }
si i = 5 ou 8 ou 13 ou 19 ...etc (tout les valeur de g)
cette valeur de i ne sera pas ajouter dans la RichTextBox
en d'autre terme
RichTextBox1.text= "0,1,2,3,4,6,7,10,11,12,14,15,16 ...etc "
pas de 5 ni de 8 ni de 9 etc dans la RichTextBox
désolé si je n'ai pas bien expliquer
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
11 sept. 2016 à 22:52
Bonsoir, et bien à la place de Distinct, tu fais Except.

https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

Les exemples sont en C#, pour convertir
https://www.google.fr/?gfe_rd=cr&ei=tcPVV4nwA46x8wec5ISQAw#q=C%23+to+vb.net

Au passage
For i As Double = 0 To 30 Step 1
puisque tu as besoin d'entier, ne l'initialise pas en tant que double
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023
11 sept. 2016 à 23:24
Merci pour ta réponse j'ai trouvé dans le site que tu ma donner le code suivant (après la conversion) :
Public Sub Linq52()
Dim numbersA() As Integer = New Integer() {0, 2, 4, 5, 6, 8, 9}
Dim numbersB() As Integer = New Integer() {1, 3, 5, 7, 8}
Dim aOnlyNumbers As IEnumerable(Of Integer) = numbersA.Except(numbersB)
Console.WriteLine(" Les chiffres en premi�re rang�e , mais pas la deuxi�me rang�e:")
For Each n In en
aOnlyNumbers
Next
Console.WriteLine(n)
End Sub

si j'ai bien compris il faut comparer entre numbersA et B, il prend les valeurs qui ne sont pas en commun
mais moi j'ai qu'un seul groupe numbersA
esque je doit crée un groupe que contient tout les valeurs de 0 à 5000
0
NHenry Messages postés 15069 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 mai 2023 158
11 sept. 2016 à 22:55
Ok,

Les outils sont similaire.
Pour savoir si une valeur est contenue dans une liste :
MaListe.Contains(...)

0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
12 sept. 2016 à 07:10
Bonjour

oui pour utiliser Except il faut 2 collections. Cependant parmi les 101 exemples, il y a la méthode Range https://code.msdn.microsoft.com/LINQ-Generation-Operators-8a3fbff7

Ce qui donne, en suivant les indications de NHenry
			Dim g() As Integer = { 5, 8, 12, 13, 3, 4, 5, 19 }
			Dim resultat As List(Of Integer) = Enumerable.Range(0, 31).Except(g).ToList()
			RichTextBox1.Text = String.Join(",", resultat)


0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
12 sept. 2016 à 15:23
Merci pour le code
en faite je n'ai pas compris le code NHenry , mais avec ton exemple il devient plus facile à comprendre
0