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


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

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.