Comment trier un dictionary qui utilise le type as object en VB2008
cs_dco
Messages postés3Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention12 mai 2009
-
11 mai 2009 à 10:30
Londonic
Messages postés298Date d'inscriptionjeudi 22 janvier 2009StatutMembreDernière intervention26 septembre 2009
-
12 mai 2009 à 14:11
Bonjour
j'ai des classes (ici class1 et class2) avec des attributs.
j'ai une classes OUTIL qui hérite de Dictionary et qui reçoit en clé une string et un object en valeur
j'ai dans ma classe de gestion des listes d'objets qui sont des listes de type de mon outil
j'ai écrit une methode AddOutil qui place dans mon dictionary les objets correctement en renversant les parametres passés (bref ce n'est pas le sujet ici )
je voudrais trier mes listes sur d'autres propriétés des mes classes, mais je ne sais pas comment faire
je pensais transformer mon outilDictionnaire en lookup mais je je ne sais pas comment
je pensais que outilDictionnaire pourrait hériter de lookup au lieu de Dictionary mais c'est impossible
ou bien utiliser LINQ mais comme dans mon outilDictionnaire j'ai un type object je n'arrive pas à le faire, je pensais convertir listeclass1 qui est un dictionary (of string,of object) en dictionary (of string,of class1) mais idem je n'arrive pas à le faire , je ne comprends pas LINQ to object avec les keyselector...
Merci de bien vouloir m'aider
existe-t'il un tuto qui pourrait m'aider ?
Public
Class Class1
Public s1var1
As
String =
""
Public s1var2
As
String =
""
End
Class
'------------------------------------------------
Public
Class Class2
Public s2var1
As
String =
""
Public s2var2
As
String
EndClass
'-----------------------------------------------
Public
Class OutilDictionnaire
Inherits System.Collections.Generic.Dictionary(
Of
String,
Object)
Public
Sub addOutil(
ByVal oValeur
As
Object,
ByVal sKey
As
String)
MyBase.Add(sKey, oValeur)
End
Sub
EndClass
'---------------------------------------------------------
Public
Class Gestion
Private listeClass1
As
New OutilDictionnaire
Private listeclass2
As
New OutilDictionnaire
Public
Sub init()
Dim c1
As
New Class1
c1.s1var1 =
"a"
c1.s1var2 =
"b"
listeClass1.addOutil(c1,
"1")
c1 =
New Class1
c1.s1var1 =
"c"
c1.s1var2 =
"d"
listeClass1.addOutil(c1,
"2")
c1.s1var1 =
"e"
c1.s1var2 =
"f"
listeClass1.addOutil(c1,
"3")
Dim c2
As
New Class2
c2.s2var1 =
"a"
c2.s2var2 =
"b"
listeclass2.addOutil(c2,
"o")
c1 =
New Class1
c2.s2var1 =
"c"
c2.s2var2 =
"d"
listeclass2.addOutil(c2,
"z")
c2.s2var1 =
"e"
c2.s2var2 =
"f"
listeclass2.addOutil(c2,
"a")
' ce que je veux ici c'est
' 1- pouvoir trier ma listeclass1 et ma listeclass2 sur une propri‚t‚ de class1 et de class2
' je pensais transformer mon outildictionnaire en lookup mais je ne sais pas comment le faire
' ou bien utiliser LINQ mais comme dans mon outilDictionnaire j'ai un type object je n'arrive pas … le faire
End
SubEnd
Londonic
Messages postés298Date d'inscriptionjeudi 22 janvier 2009StatutMembreDernière intervention26 septembre 2009 11 mai 2009 à 13:48
Bonjour dco,
Je propose de faire un module générique avec les décarations de types necessaires du genre:
Friend
Delegate
Function
critere(
ByVal
p
As
Object
,
ByVal
q
As
Object
)
As
Integer
et les classes, subs et fonctions génériques de tri, par exemple:
Module Tri
Friend
Delegate
Function critere(
ByVal p
As
Object,
ByVal q
As
Object)
As
Boolean
Friend
Function Tri(
ByVal Ensemble
As Collection, _
ByVal Comparaison
As critere, _
Optional
ByVal sens
As
Boolean =
True)
Dim Tampon
As
New Collection
Dim O
As
Object
For i = Tampon.Count - 1
To 0
Step -1
O = Ensemble.Item(i)
For j = 0
To i
If Comparaison(O, Ensemble.Item(j)) = -1 _
Then O = Ensemble.Item(j)
Next
Tampon.Add(O)
Next
Return Tampon
End
Function
End
Module
Dans un autre module on mettrait les sources de la classe métier (primitives de progiciel).
On pourrait ainsi développer rapidement des Samples (petites applis), des modules utilisateurs, des classes visuelles et intègrer tout dans des treeviews pour bénéficier du même genre de travail qu'on ferait en parallèle sur les treeNodes.
Londonic
Messages postés298Date d'inscriptionjeudi 22 janvier 2009StatutMembreDernière intervention26 septembre 2009 11 mai 2009 à 13:54
'D'abord, je comprends pas pourquoi la classe Outils hérite du dictionnaire au lieu d'en utiliser une instance comme paramètre? Le champ d'application des outils est-il si large? Est-ce que ca risque pas de limiter les développements ultérieurs de la classe outils a des applications de dictionnaire amélioré?
cs_dco
Messages postés3Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention12 mai 2009 11 mai 2009 à 14:00
effectivement ça à l'air compliqué pour si peu mais j'ai juste fait un exemple, nous sommes dans une appli beaucoup plus grosse et nous avons besoin d'outils génériques
nous avons toute "mécanique" qui nous lit les données de la BD puis les transforme en objets bien définis, puis nous travaillons avec des listes qui sont aussi faites par notre mécanique, d'où l'utilisation de notre classe OutilDictionnaire qui hérite de dictionary
en fait nous sommes en train de convertir un gros projet VB6 en vb2008
cs_dco
Messages postés3Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention12 mai 2009 12 mai 2009 à 11:18
oui c'est un peu ça mais dans l'exemple la liste (peopleenum) est une liste de person alors que ma difficulté est d'avoir une liste d'object
si je pouvait transformer ma liste d'objet en liste du type que je souhaite alors je pense que j'irais plus loin
Londonic
Messages postés298Date d'inscriptionjeudi 22 janvier 2009StatutMembreDernière intervention26 septembre 2009 12 mai 2009 à 12:38
A mon tour de poser une question.
Dans l'exemple MS-Help ci dessus, les variables (Classe structurées avec deux Strings) sont ajoutées à la fin d'un tableau. J'imagine mal tout ce que le compilateur doit ajouter dans le code pour gérer la mémoire, La vraie question serait: qu'est-ce qui est géré par des vieilles résurgences de vb6 (il suffit de trier des treenodes pour comprendre) et qu'est-ce qui est issu du vrai domaine public, bien débuggé et ayant fait ses preuves sur de nombreux systèmes avec différentes interfaces utilisateur visuelles à fenêtre, et dont les performances n'attendent plus qu'une vraie gestion système multitâche aussi bien pour répartir les cycles que gérer les tampons de mémoire périphériques ou éxécuter des primitives d'usage. En attendant de rassembler les affinités ( Les applications graphiques, 2D, 3D, photo, multimédia sembleraient avoir quelque chose en commun), on va pas se poser de questions sur le tri, ce serait trop vaste.
Alors voilà la question:
En partant du principe que la mémoire dynamique n'est jamais assez rapide mais qu'on manque jamais de statique, Le swift va-t-il plus vite dans une liste ou dans un tableau ? (En Vb, en considérerant l'utilisation d'une variable tampon globale)
Londonic
Messages postés298Date d'inscriptionjeudi 22 janvier 2009StatutMembreDernière intervention26 septembre 2009 12 mai 2009 à 12:45
Ca doit coincer au niveau de la gestion mémoire par le basic: J'ai eu des difficultés pour trier des treenodes parce que je ne pouvais ni les manipuler par référence, ni affecter les variables de la liste par valeur.
J'ai ajouté Chacun des résultats de mon tri à la fin de ma liste (Liste.Add(Variable)) et supprimé (Liste.delete ou qqchose comme ça) à chaque itération (Voir mon ViewDoc dans les codes).
Londonic
Messages postés298Date d'inscriptionjeudi 22 janvier 2009StatutMembreDernière intervention26 septembre 2009 12 mai 2009 à 13:29
Autant pour moi,
c'est dans Freelog, (eternellement en travaux), mais bientot dans ViewDoc.
Friend
Sub Dostri(
ByVal V
As TreeNodeCollection)
Dim Smaller
As
Integer
Dim i, j
As
Integer
For i = V.Count - 1
To 0
Step -1
Smaller = 0
For j = 1
To i
If
String.Compare(V(j).Text.ToUpper, V(Smaller).Text.ToLower) = -1
Then Smaller = j
Next
Dim T
As
New TreeNode
T = V(Smaller).Clone()
V.Add(T)
V.RemoveAt(Smaller)
Next
End
Sub
On applique l'algo aux collections d'objets et on trie des "outildictionnaires".
On aura besoin d'une fonction de comparaison du genre:Friend
Delegate
Function
critere(
ByValp
As
Object
,
ByValq
As
Object
)
As
SByte
Dim a,b as outilsdictionnaires
a= p:b=q : if ........programme de comparaison de a et b ....... then return 1 else return 0
REM On utilise SByte pour multiplier un peu les fonctionalités, mais Boolean conviendrait trés bien.
Je vais intègrer l'algo dans le module tri de oulisdico
Friend
Function
Tri(
ByVal
Ensemble
As
Collection, _
ByVal
Comparaison
As
critere, _
Optional
ByVal
sens
As
Boolean
=
True
)
Dim
Tampon
As
New
Collection
Dim
O
As
Object
For
i = Tampon.Count - 1
To
0
Step
-1
O = Ensemble.Item(i)
For
j = 0
To
i
If
Comparaison(O, Ensemble.Item(j)) = -1
Then
O = Ensemble.Item(j)
Next