Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment éviter les doublons

5 réponses
Avatar
debdrai
Salut a tous !

Je travaille avec un r=E9seau routier dans lequel un usager entre un
num=E9ro d'intersection et ca lui retourne le nom des rues connect=E9es
=E0 cette intersection. Le probleme est que si c'est une intersection au
milieu d'une grande rue, les troncons de rue AVANT et APRES
l'intersection peuvent avoir le m=EAme nom, et ca me retourne donc deux
fois le m=EAme nom de rue dans mon r=E9sultat (une collection).

J'ai essay=E9 de faire une boucle consistant =E0 aller chercher le nom de
la rue (variable NomRue) d'un troncon, puis l'ajouter =E0 la collection
mRue (mRue.Add(NomRue)), puis ajouter un IF permettant de dire que si
ma variable NomRue =3D mRue.Item(x), je ne l'ajoute pas, mais
n=E9cessairement, ca va refuser de l'ajouter d=E8s la premi=E8re fois...
Je ne sais pas si c'est clair, c'est dur =E0 expliquer

Si quelqu'un connait un moyen de ne pas ajouter plus d'une fois le meme
item a une collection...

Merci !

Deb

5 réponses

Avatar
Millox Frédéric
Salut Debdrai,

D'après ce que tu marques, j'ai fait ce petit exemple :

Dim c As New Collection
Dim list As String() = {"rue1", "rue2", "rue1", "rue3"}
Dim NomRue As String
Dim ajout As Boolean = True

' Init.
c.Add(list(0))

For i As Integer = 1 To list.Length - 1
ajout = True
NomRue = list(i)
For j As Integer = 1 To c.Count
If NomRue = c.Item(j) Then
ajout = False
End If
Next
If ajout Then c.Add(NomRue)
Next

MsgBox(c.Count) me retourne 3;

Tiens moi au courant si c'est complètement hors sujet.

Voilà , a+.

--
fmillox


"" a écrit :

Salut a tous !

Je travaille avec un réseau routier dans lequel un usager entre un
numéro d'intersection et ca lui retourne le nom des rues connectées
à cette intersection. Le probleme est que si c'est une intersection au
milieu d'une grande rue, les troncons de rue AVANT et APRES
l'intersection peuvent avoir le même nom, et ca me retourne donc deux
fois le même nom de rue dans mon résultat (une collection).

J'ai essayé de faire une boucle consistant à aller chercher le nom de
la rue (variable NomRue) d'un troncon, puis l'ajouter à la collection
mRue (mRue.Add(NomRue)), puis ajouter un IF permettant de dire que si
ma variable NomRue = mRue.Item(x), je ne l'ajoute pas, mais
nécessairement, ca va refuser de l'ajouter dès la première fois...
Je ne sais pas si c'est clair, c'est dur à expliquer

Si quelqu'un connait un moyen de ne pas ajouter plus d'une fois le meme
item a une collection...

Merci !

Deb




Avatar
Millox Frédéric
Oups , ca marche mais ca n'est pas très propre au niveau de l'algo.

Donc petit rectificatif :

Dim c As New Collection
Dim list As String() = {"rue1", "rue2", "rue1", "rue3"}
Dim NomRue As String
Dim ajout As Boolean

For i As Integer = 0 To list.Length - 1
ajout = True
NomRue = list(i)
For j As Integer = 1 To c.Count
If NomRue = c.Item(j) Then
ajout = False
End If
Next
If ajout Then c.Add(NomRue)
Next

Console.WriteLine(c.Count)
For i As Integer = 1 To c.Count
Console.WriteLine(CStr(c.Item(i)))
Next

a+

--
fmillox


"Millox Frédéric" a écrit :

Salut Debdrai,

D'après ce que tu marques, j'ai fait ce petit exemple :

Dim c As New Collection
Dim list As String() = {"rue1", "rue2", "rue1", "rue3"}
Dim NomRue As String
Dim ajout As Boolean = True

' Init.
c.Add(list(0))

For i As Integer = 1 To list.Length - 1
ajout = True
NomRue = list(i)
For j As Integer = 1 To c.Count
If NomRue = c.Item(j) Then
ajout = False
End If
Next
If ajout Then c.Add(NomRue)
Next

MsgBox(c.Count) me retourne 3;

Tiens moi au courant si c'est complètement hors sujet.

Voilà , a+.

--
fmillox


"" a écrit :

> Salut a tous !
>
> Je travaille avec un réseau routier dans lequel un usager entre un
> numéro d'intersection et ca lui retourne le nom des rues connectées
> à cette intersection. Le probleme est que si c'est une intersection au
> milieu d'une grande rue, les troncons de rue AVANT et APRES
> l'intersection peuvent avoir le même nom, et ca me retourne donc deux
> fois le même nom de rue dans mon résultat (une collection).
>
> J'ai essayé de faire une boucle consistant à aller chercher le nom de
> la rue (variable NomRue) d'un troncon, puis l'ajouter à la collection
> mRue (mRue.Add(NomRue)), puis ajouter un IF permettant de dire que si
> ma variable NomRue = mRue.Item(x), je ne l'ajoute pas, mais
> nécessairement, ca va refuser de l'ajouter dès la première fois...
> Je ne sais pas si c'est clair, c'est dur à expliquer
>
> Si quelqu'un connait un moyen de ne pas ajouter plus d'une fois le meme
> item a une collection...
>
> Merci !
>
> Deb
>
>


Avatar
debdrai
Salut Fred,

Impeccable ! Ta méthode fonctionne parfaitement, merci d'avoir pris le
temps d'avoir écrit ce code !

Deb
Avatar
Millox Frédéric
Pas de problème pour l'aide et si tu veux , rajoute cette ligne de code "
exit For " juste après " ajout = False " ca te fera gagner un peu de temps de
calcul si l'appli tourne avec beaucoup de données.

a+

--
fmillox


"" a écrit :

Salut Fred,

Impeccable ! Ta méthode fonctionne parfaitement, merci d'avoir pris le
temps d'avoir écrit ce code !

Deb




Avatar
Zoury
Salut Deb ! :O)

Tu pourrais également employé une StringCollection pour stockée tes chaines
et testé l'existence de celles-ci à l'aide de la fonction IndexOf() :
'***
Option Explicit On

Imports System.Collections.Specialized

Module MainModule

Public Sub Main()

Dim sc As StringCollection
sc = New StringCollection

' on ajoute des items de départ pour le test
sc.AddRange(New String() {"item 1", "item 2", "item 3"})

' on tente l'ajout d'items supplémentaires
' en testant leur existance par le biais
' de la fonction IndexOf
AddItem(sc, "item 4")
AddItem(sc, "item 3")
AddItem(sc, "item 5")

End Sub

Private Function AddItem(ByVal sc As StringCollection, ByVal item As
String) As Int32

If (sc.IndexOf(item) = -1) Then
Console.WriteLine("{0} à été ajouté à la collection", item)
Return sc.Add(item)
End If

Console.WriteLine("{0} est déjà dans la collection", item)
Return -1

End Function

End Module
'***

--
Cordialement
Yanick
MVP pour Visual Basic
a écrit dans le message de
news:
Salut a tous !

Je travaille avec un réseau routier dans lequel un usager entre un
numéro d'intersection et ca lui retourne le nom des rues connectées
à cette intersection. Le probleme est que si c'est une intersection au
milieu d'une grande rue, les troncons de rue AVANT et APRES
l'intersection peuvent avoir le même nom, et ca me retourne donc deux
fois le même nom de rue dans mon résultat (une collection).

J'ai essayé de faire une boucle consistant à aller chercher le nom de
la rue (variable NomRue) d'un troncon, puis l'ajouter à la collection
mRue (mRue.Add(NomRue)), puis ajouter un IF permettant de dire que si
ma variable NomRue = mRue.Item(x), je ne l'ajoute pas, mais
nécessairement, ca va refuser de l'ajouter dès la première fois...
Je ne sais pas si c'est clair, c'est dur à expliquer

Si quelqu'un connait un moyen de ne pas ajouter plus d'une fois le meme
item a une collection...

Merci !

Deb