Recherche dans tableau de valeurs non connues à l'avance [Résolu]

Messages postés
32
Date d'inscription
mardi 17 août 2010
Dernière intervention
26 juillet 2015
-
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


--
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
1
Merci
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 105 internautes nous ont dit merci ce mois-ci

Commenter la réponse de vb95
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
1
Merci
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 105 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_ShayW
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
1
Merci
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/

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 105 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
1
Merci
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 105 internautes nous ont dit merci ce mois-ci

berserker42
Messages postés
32
Date d'inscription
mardi 17 août 2010
Dernière intervention
26 juillet 2015
-
Merci pour ces précisions.
Whismeril
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
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
Commenter la réponse de vb95
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
0
Merci
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.
Commenter la réponse de Whismeril
Messages postés
32
Date d'inscription
mardi 17 août 2010
Dernière intervention
26 juillet 2015
0
Merci
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/

--
Commenter la réponse de berserker42
Messages postés
32
Date d'inscription
mardi 17 août 2010
Dernière intervention
26 juillet 2015
0
Merci
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....


--
Whismeril
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
Ca dépend de ce que tu veux faire, si tu tries le dgv, tu changes les index...
berserker42
Messages postés
32
Date d'inscription
mardi 17 août 2010
Dernière intervention
26 juillet 2015
> Whismeril
Messages postés
12426
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
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.
Commenter la réponse de berserker42
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
0
Merci
Bonjour à tous en passant ( pour répondre à cs_Shayw)
Commenter la réponse de vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
0
Merci
J'ai oublié Whismeril ! désolé !
Commenter la réponse de vb95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.