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

berserker42 32 Messages postés mardi 17 août 2010Date d'inscription 26 juillet 2015 Dernière intervention - 4 mai 2015 à 15:59 - Dernière réponse : Whismeril 11627 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention
- 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


--
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
vb95 1590 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 4 mai 2015 à 17:25
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

Merci vb95 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de vb95
Meilleure réponse
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 4 mai 2015 à 20:19
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

Merci cs_ShayW 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de cs_ShayW
Meilleure réponse
Whismeril 11627 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 5 mai 2015 à 07:54
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/

Merci Whismeril 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de Whismeril
Meilleure réponse
vb95 1590 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 5 mai 2015 à 15:07
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

Merci vb95 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

berserker42 32 Messages postés mardi 17 août 2010Date d'inscription 26 juillet 2015 Dernière intervention - 5 mai 2015 à 15:21
Merci pour ces précisions.
Whismeril 11627 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 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
Commenter la réponse de vb95
Whismeril 11627 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 4 mai 2015 à 22:08
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
berserker42 32 Messages postés mardi 17 août 2010Date d'inscription 26 juillet 2015 Dernière intervention - 5 mai 2015 à 07:08
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
berserker42 32 Messages postés mardi 17 août 2010Date d'inscription 26 juillet 2015 Dernière intervention - Modifié par berserker42 le 5/05/2015 à 08:06
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 11627 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 5 mai 2015 à 11:28
Ca dépend de ce que tu veux faire, si tu tries le dgv, tu changes les index...
berserker42 32 Messages postés mardi 17 août 2010Date d'inscription 26 juillet 2015 Dernière intervention > Whismeril 11627 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 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.
Commenter la réponse de berserker42
vb95 1590 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 5 mai 2015 à 12:15
0
Merci
Bonjour à tous en passant ( pour répondre à cs_Shayw)
Commenter la réponse de vb95
vb95 1590 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - 5 mai 2015 à 12:17
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.