Recherche dans tableau de valeurs non connues à l'avance

Résolu
berserker42 Messages postés 32 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 26 juillet 2015 - Modifié par berserker42 le 4/05/2015 à 16:00
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 5 mai 2015 à 15:51
Bonjour à tous,

Je réalise pour moi une application pour travailler sur les tableaux et les datagridview.

Je dimensionnes et alimentes un tableau à partir d'une colonne d'un datagridview précise.

Jusqu'à là pas de problème. Je voudrais à partir de ce moment chercher les doublons mais ne pas les supprimer et retourner le nombre d'éléments différents et leur rang dans le datagridview (= tableau?).

J'ai trouvé des exemples sur le web mais supprimes les doublons et me semble pas correspondre à mon cas.
J'ai pensé à excel avec la fonction NBVAL_DISTINCT mais rien à voir...

voici ce que j'ai essayé:
les valeurs exemples
10
10
10
8
10
10
10
14
10
6.917
6.647

Je voudrais
10: 0,1,2,4,5,6,8
8: 3
14:7
6.917:9
6.647:10
et me ressortir le nombres d'entrées différentes ici 5.

J'arrives actuellement à retourner la longueur du nouveau tableau uniquement pour 10 car valeur en dure. recherched est imbriquée dans une autre fonction.

Je pense que j'ai très mal commencé.

Merci de votre aide pour me ré-orienter vers une solution/méthode je ne vois pas comment faire.

Private Sub recherched()

        Dim w As Integer = Data_holefit.RowCount - 1 'datagridview avec toutes les valeurs 
        ReDim diam(w) 'tableau redimensionné
        For q = 0 To w
            diam(q) = Data_holefit.Item(9, q).Value 'remplissage 
        Next

        Dim subdiam() As Double = Array.FindAll(diam, AddressOf diametre)

        MsgBox(subdiam.Length)' ici 7

    End Sub

    Private Shared Function diametre(ByVal s As Double) As Boolean
        If s = 10 Then
            Return True
        Else
            Return False
        End If
    End Function


--

9 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
4 mai 2015 à 17:25
salut
Un exemple tout prêt avec les valeurs que tu donnes en exemple

Imports System.Collections.Generic

Public Class Form1

Private Structure parametres
Dim valeur As Double
Dim indices As String
End Structure

Private valeurs() As Double
Private resultats As New List(Of parametres)
Private resultat As parametres

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Dim chaine As String
Dim trouve As Boolean

ReDim valeurs(0 To 10)
valeurs(0) = 10
valeurs(1) = 10
valeurs(2) = 10
valeurs(3) = 8
valeurs(4) = 10
valeurs(5) = 10
valeurs(6) = 10
valeurs(7) = 14
valeurs(8) = 10
valeurs(9) = 6.917
valeurs(10) = 6.647
TextBox.Text = String.Empty
For i = 0 To valeurs.Length - 1
If resultats.Count = 0 Then
resultat.valeur = valeurs(i)
resultat.indices = i.ToString
resultats.Add(resultat)
Else
trouve = False
For j = 0 To resultats.Count - 1
If resultats(j).valeur = valeurs(i) Then
resultat.indices = resultats(j).indices & "-" & i.ToString
resultat.valeur = resultats(j).valeur
resultats.RemoveAt(j)
resultats.Insert(j, resultat)
trouve = True
Exit For
End If
Next
If trouve = False Then
resultat.valeur = valeurs(i)
resultat.indices = i.ToString
resultats.Add(resultat)
End If
End If
Next
chaine = String.Empty
For i = 0 To resultats.Count - 1
chaine = chaine & resultats(i).valeur.ToString & " : " & resultats(i).indices & Environment.NewLine
Next
chaine = chaine & Environment.NewLine & "Nombre d'occurrences : " & resultats.Count.ToString
TextBox.Text = chaine

End Sub

End Class



et tu rajoutes une Textbox multilignes sur ta form ( la Textbox s'appelle Textbox ( propriété Name )
Reste à l'adapter à ton programme
1
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
4 mai 2015 à 20:19
Bonjour

En net tu as les list of

Private Class typelist
Public number As Double
Public indexes As New List(Of Integer)
End Class
Private laliste As New List(Of typelist)
Private Sub SetList()
laliste.Clear()
Dim num As Double
Dim t As typelist
Dim found As Boolean
'on lit chaque élément de la colonne
For iter = 0 To dgv.Rows.Count - 1
num = Convert.ToDouble(dgv.Rows(iter).Cells("Column1").Value)
found = False
For Each item In laliste
If item.number = num Then
item.indexes.Add(iter)
found = True
Exit For
End If
Next
If Not found Then
t = New typelist
t.number = num
t.indexes.Add(iter)
laliste.Add(t)
End If
Next

End Sub

   dim x as integer 
x= lalist.count ' te donne le nombre d'éléments distincts


Bonjour vb95
1
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
5 mai 2015 à 07:54
Bonjour, l'indexation de chaque élément ne marche pas avec distinct, alors j'ai fait un groupie

    Private Sub ValeurIndexees()
        Dim valeurs() As Double = {10, 10, 10, 8, 10, 10, 10, 14, 10, 6.917, 6.647}

        Dim resultatSansClass = valeurs.Select(Function(v, i) New With {Key .Valeur = v, Key .Index = i}).GroupBy(Function(x) x.Valeur)'sans classe déjà écrite

        Dim resultatAvecClass = valeurs.Select(Function(v, i) New ValeursIndexees With {.Valeur = v, .Index = i}).GroupBy(Function(x) x.Valeur)'avec une classe 

    End Sub


Le code de la classe, attention c'est différent d'une structure, et oui tu peux y ajouter des propriétés, des méthodes, etc...
Public Class ValeursIndexees
    Public Property Valeur() As Double

    Public Property Index() As Integer
End Class


Voir ici pour plus de détails
http://plasserre.developpez.com/cours/vb-net/
1
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
5 mai 2015 à 15:07
salut berserker42

1) A la question "Est-ce que en triant ma dgv dans l'ordre croissant j'aurais pus arriver au même résultat à votre avis? C'est l'idée que j'ai eu en allant dormir.... "
je réponds Oui le résultat est le même mais aucun gain de temps ! Il faut qu' à chaque nouvelle valeur dans le tableau d'origine regarder si elle existe déjà dans le tableau récupéré à la fin . Et quel que soit l'ordre des valeurs du tableau d'origine

2) Tu dis aussi : "Je ne connaissait pas list of ( collections?) très puissant. Si par exemple je veut rajouter une information dans cette list je dois rajouter dans cette structure."

Private Class typelist
Public number As Double
Public indexes As New List(Of Integer)
'-> rajouter ICI ?
End Class


Dans cet exemple c'est une classe et non une structure . L'exemple que je t'ai donné en code contient lui une structure.
Mais c'est bien ici qu'il faut le rajouter à mon humble avis

bonsoir à tous et bonne prog
1
berserker42 Messages postés 32 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 26 juillet 2015
5 mai 2015 à 15:21
Merci pour ces précisions.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
5 mai 2015 à 15:51
En complément Shayw a pris un petit raccourci en rendant public une variable de la class.
Dans ce cas ça ne change rien.
Mais prenons une classe Humain, de l'extérieur tu veux savoir quel est la couleur des yeux, mais ne pas pouvoir la modifier. Coder comme ça tu ne peux pas.

C'est pour ça qu'il est préférable d'utiliser une propriété.
Si tu veux qu'elle soit en lecture / ecriture et que tu n'as rien de spécial à faire sur la donnée à l'intérieur (comme ici) tu mets le code de base que j'ai utilisé dans mon exemple.

Si tu veux une propriété à lecture seule (la couleur des yeux) ou si elle est issue d'un calcul (pression sanguine dépend de pleins de choses), tu l'attaches à une variable interne privée.

Si à l'avenir le comportement interne doit changer, pour l'extérieur la propriété ne change pas
0

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

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
4 mai 2015 à 22:08
Bonsoir VB95 et ShayW, je n'ai pas le temps de mettre un exemple ce soir, mais avec Linq, et la méthode Distinct ça doit se faire en une ligne.
0
berserker42 Messages postés 32 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 26 juillet 2015
5 mai 2015 à 07:08
Bonjour à tous,
Merci pour votre temps et le code.

J'ai testé les 2 et fonctionnent.
Dans les 2 cas j'ai bien le nombre d'entrées différentes, et la ligne ou je peut trouver chaque entrées.

Je ne connaissait pas list of ( collections?) très puissant. Si par exemple je veut rajouter une information dans cette list je dois rajouter dans cette structure.


Private Class typelist
        Public number As Double
        Public indexes As New List(Of Integer)
'-> rajouter ICI ?
    End Class


J'attend que Whismeril poste son exemple par curiosité avant de validé mais j'ai les réponses à mes problèmes.


MERCI \m/

--
0
berserker42 Messages postés 32 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 26 juillet 2015
Modifié par berserker42 le 5/05/2015 à 08:06
Bonjour,

Merci pour le code et le lien que consulte très souvent...

Est-ce que en triant ma dgv dans l'ordre croissant j'aurais pus arriver au même résultat à votre avis? C'est l'idée que j'ai eu en allant dormir....


--
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
5 mai 2015 à 11:28
Ca dépend de ce que tu veux faire, si tu tries le dgv, tu changes les index...
0
berserker42 Messages postés 32 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 26 juillet 2015 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
5 mai 2015 à 11:34
Le but était de regrouper les valeurs rechercher pour les traiter ensembles avec les mêmes propriétés. Enfin je 'aperçois maintenant que ça demandais beaucoup d'opérations sur la dgv et pas encore sûre que ça marche comme je le veut.

Mais merci de ta réponse.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
5 mai 2015 à 12:15
Bonjour à tous en passant ( pour répondre à cs_Shayw)
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
5 mai 2015 à 12:17
J'ai oublié Whismeril ! désolé !
0
Rejoignez-nous