Longarraylist: créer un arraylist typé de toutes pièces

Soyez le premier à donner votre avis sur cette source.

Vue 8 333 fois - Téléchargée 419 fois


Description

Ce code montre comment créer un ArrayList d'un type précis de toutes pièces, en attendant les collections génériques de Whidbey. Hériter CollectionBase ou implémenter IList pourrait être une idée, mais comme toutes les fonctions prises en charge par IList portent sur de objets, si on veut faire une liste d'un type par valeur (Comme Long), on pert en efficacité avec des longues listes (à cause des boxing - unboxing successifs). La solution consiste à recoder un ArrayList, à savoir une liste qui enveloppe un tableau, et qui fait appel aux fonctions partagées de Array, qui sont très rapides et tiennent compte du type du tableau utilisé.

Source / Exemple :


=> Zip

Conclusion :


Compilable sans Visual Studio (nécessite juste le Runtime .NET): exécuter compile.bat

Pour faire un arraylist d'un type quelconque: j'ai essayé de faire une classe de base GenericArray et de l'hériter mais les performances deviennent pire qu'un ArrayList normal alors le plus simple est de copier/coller le code de LongArrayList et de changer la région "Implémentation typée de IList". C'est pas très propre mais ca marche très bien :)

Exemple de performances moyenes obtenues sur un Athlon 2.2 Ghz:

Généré 100000 indexes & valeurs aléatoires.
ArrayList.Fill: 00:00:00.0156250
ArrayList.Search: 00:00:00.0312500
ArrayList.Iteration: 00:00:00
ArrayList.Sort: 00:00:00.2187500

HashTable.Fill: 00:00:00.0625000
HashTable.Search: 00:00:00.0468750
HashTable.Iteration: 00:00:00.0312500

LongArrayList.Fill: 00:00:00.0156250
LongArrayList.Search: 00:00:00.0156250
LongArrayList.Iteration: 00:00:00
LongArrayList.Sort: 00:00:00.0468750

SortedList.Fill: 00:00:00.1562500
SortedList.Search: 00:00:00.2812500
SortedList.Iteration: 00:00:00.2031250

Généré 1000000 indexes & valeurs aléatoires.
ArrayList.Fill: 00:00:00.1875000
ArrayList.Search: 00:00:00.3593750
ArrayList.Iteration: 00:00:00.0625000
ArrayList.Sort: 00:00:03.1250000

HashTable.Fill: 00:00:00.7656250
HashTable.Search: 00:00:00.7187500
HashTable.Iteration: 00:00:00.2500000

LongArrayList.Fill: 00:00:00.0468750
LongArrayList.Search: 00:00:00.1562500
LongArrayList.Iteration: 00:00:00.0156250
LongArrayList.Sort: 00:00:00.5781250

SortedList.Fill: 00:00:02.4062500
SortedList.Search: 00:00:04.7343750
SortedList.Iteration: 00:00:01.8281250

Généré 10000000 indexes & valeurs aléatoires.
ArrayList.Fill: 00:00:05.5312500
ArrayList.Search: 00:00:05.0312500
ArrayList.Iteration: 00:00:00.5937500
ArrayList.Sort: 00:00:50.7031250

HashTable.Fill: 00:00:35.7812500
HashTable.Search: 00:00:34.9531250
HashTable.Iteration: 00:00:03.1406250

LongArrayList.Fill: 00:00:00.7968750
LongArrayList.Search: 00:00:01.9687500
LongArrayList.Iteration: 00:00:00.1875000
LongArrayList.Sort: 00:00:07.1406250

SortedList.Fill: 00:00:43.9531250
SortedList.Search: 00:01:30.1093750
SortedList.Iteration: 00:00:22.7031250

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

vincentescalade
Messages postés
87
Date d'inscription
samedi 3 mai 2003
Statut
Membre
Dernière intervention
9 juin 2005
-
Ok merci c marche.

Merci encore

@ ++
Xya
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005
-
Excuse moi j'ai pas pris le temps de relire mon code et les lignes avec AddHandler ont en effet une erreur. J'aurai du écrire:

'socket_Connected est une méthode qui a la même signature que l'événement
'index: numéro du socket
AddHandler list.Item(index).Connected, AddressOf socket_Connected

'MySocket est la classe de socket perso
AddHandler DirectCast(list.Item(index), MySocket).Connected, AddressOf socket_Connected
vincentescalade
Messages postés
87
Date d'inscription
samedi 3 mai 2003
Statut
Membre
Dernière intervention
9 juin 2005
-
J'ai utilisé l'arraylist mais il me mais une erreur sur DirectCast:

AddHandler Sck.onConnect, DirectCast(list.Item(0), SocketsClient).onConnect()

L'erreur c'est : 'Public Event OnConnect' est un événement. Il ne peut donc être appelé directement. Utilisez une instruction 'Raisevent' pour déclencher un événement.

Pourtant ma class perso mysockets contient bien un raisevent pour l'événement 'Onconnect'.

Voilà dsl de t'embêter comme ça mais je débute en .net et j'ai un peu de mal.
Xya
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005
-
Je pense que c'est possible:

Si tu as ta propre version de ArrayList (par ex SocketList) et que tu veuilles accéder à l'événement Connected:

'quelque part....
Dim list As SocketList

'socket_Connected est une méthode qui a la même signature que l'événement
'index: numéro du socket
AddHandler socket_Connected, list.Item(index).Connected

Si tu utilises un ArrayList normal:

'quelque part...
Dim list As ArrayList

'MySocket est la classe de socket perso
AddHandler socket_Connected, DirectCast(list.Item(index), MySocket).Connected

J'espère que ca peux t'aider...
vincentescalade
Messages postés
87
Date d'inscription
samedi 3 mai 2003
Statut
Membre
Dernière intervention
9 juin 2005
-
En faite pour etre plus claire. Je voudrais créer dinamiquement des objets de ma classe et pour chacun des objets récupérer les événements de la classe.

C possible de faire ca?

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.