Comment trier un dictionary qui utilise le type as object en VB2008

Signaler
Messages postés
3
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
12 mai 2009
-
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009
-
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

Class

12 réponses

Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

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.



Amuse-toi bien.
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

'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é?








Public





Class

Form1



Friend

Liste1


As





New

OutilDico



Friend

Liste2


As





New

OutilDico





Private





Sub

Listest()



With

Liste1
.Add(


New

MotCle(


"a"

,


"b"

),


"1"

)
.Add(


New

MotCle(


"c"

,


"d"

),


"2"

)
.Add(


New

MotCle(


"e"

,


"f"

),


"3"

)



End





With








With

Liste2
.Add(


New

MotCle(


"a"

,


"b"

),


"o"

)
.Add(


New

MotCle(


"c"

,


"d"

),


"z"

)
.Add(


New

MotCle(


"e"

,


"f"

),


"a"

)



End





With



End





Sub
End





ClassClass



OutilDico



Friend

Liste


As

Dictionary(


Of





String

,


Object

)



Public





Sub

Add(


ByVal

Data


As





Object

,


ByVal

Cle


As





String

)
Liste.Add(Cle, Data)



End





Sub
End





ClassClass



MotCle



Friend

Cle


As





String



Friend

Mot


As





String



Friend





Sub





New

(


Optional





ByVal

Clef


As





String

=


Nothing

, _



Optional





ByVal

Data


As





String

=


Nothing

)Cle Clef : Mot Data



End





Sub
End





Class
Messages postés
3
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
12 mai 2009

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


 
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

Autant pour moi. (Un critère de plus dans la couche métier)

With Liste2
.Add(
NewObjCle(
"a",
"b"),
"o")
.Add(
NewObjCle(
"c",
"d"),
"z")
.Add(
NewObjCle(
"e",
"f"),
"a")

End
With
End
Sub
End
Class

Class ObjCle
FriendCle As
String
FriendMot As Object

Friend
Sub
New(
Optional
ByValClef As
String= Nothing, _
Optional
ByValData As 
Object= Nothing)Cle Clef : Mot Data
End
Sub
End
Class
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

Si reprendre vieux vb6 entrées manuelles pourquoi pas travailleur devenir net.profiteur ?
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

PS. Je trouve que votre truc ressemble à l'exemple de MSHelp ci dessous.

ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.fr/fxref_mscorlib/html/ac51e49b-d813-976a-7aa4-10b7ec9a703e.htm
Messages postés
3
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
12 mai 2009

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
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

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)

Merci de participer.
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

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).
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

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

  Tampon.Add(O)
 Next

 Return
Tampon
End

Function

@+
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

Module




Tri



Friend





Delegate





Function

critere(


ByVal

p


As





Object

,


ByVal

q


As





Object

)


As





SByte








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)



Nex


Tampon.Add(O)



Next



Return

Tampon



End





Function








Friend





Function

Compare_TreeNode(


ByVal

p


As





Object

,


ByVal

q


As





Object

)


As





SByte



'Transtypage.



Dim

a


As

TreeNode = p



Dim

b


As

TreeNode = q



'Comparaison



Return





String

.Compare(p.Text.ToUpper, q.Text.ToLower)



End





Function








'Retourne une collection triee



Friend





Function

TriCollection(


ByVal

V


As

Collection,


ByVal

Comparaison


As

critere)


As

Collection



Dim

Collection_Triee


As





New

Collection



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

Comparaison(V(j), V(Smaller)) = -1


Then

Smaller = j



Next


Collection_Triee.Add(V(j))



Next



Return

Collection_Triee



End





Function
End





Module
Messages postés
298
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
26 septembre 2009

Module




Tri



Friend





Delegate





Function

critere _
(


ByVal

p


As





Object

,


ByVal

q


As





Object

)


As





SByte










'Exemple de délégué.

Friend





Function



 
CompareTreeNodes _
  (


ByVal



p




As






Object



,


ByVal





q




As






Object



)  _



  As





SByte





'Transtypage.



   Dim

a


As




TreeNode = p



   Dim



b


As


TreeNode = q



'Comparaison



Return






String



.Compare _
(p.Text.ToUpper, q.Text.ToLower)



End





Function




'Retourne une collection triee



Friend





Function

TriCollection _
(


ByVal

V


As

Collection,  _



ByVal

Comparaison


As

critere)  _



As

Collection



Dim

Collection_Triee


As





New

Collection



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

Comparaison(V(j), V(Smaller)) = -1  _



   Then

Smaller = j



  Next


 Collection_Triee.Add(V(j))



 Next



 Return

Collection_Triee



End





FunctionEnd







Module