Bonjour,
j’ouvre ce thread parce que j’ai l’impression de réaliser une horreur et que je voudrai la confirmation qu’il n’y a vraiment pas moyen de faire autrement (et que je suis pas passé à coté d’un truc gros comme un maison)
Voila le problème : J’ai une HashTable et je doit prendre aléatoirement un certain nombre d’éléments dedans, à priori je ne sait pas exactement le nombre car ca dépent des objets en eux-même mais je peux facilement l’approximer.
Evidement naïf comme je suis, j’ai codé tout connement :
int size = MaHashTable.Count;
Random R;
while([...]) Elem E = MaHashTable[R.Next(size)];
Quelques minutes, foirages et segfaults plus tard, je me suis finallement rappelé que l’operateur [] de la HashTable sert à mettre une clé, pas un numéro d’élément :P.
Et comme vous devez-vous en doutez, j’ai aucune idée de ce que sont ces clées (sinon je viendrai pas vous faire chier) même si à priori ce sont des string.
J’ai pensé par après à utiliser la propriété Values, le seul problème que c’est une liste (enfin une Icollection), donc pas d’opérateur[], une complexité en O(n) pour les accès aléatoires à un élément et je doit itérer à la main (et comme je doit tirer un nombre inconnu d’éléments…).
En ce moment dans ma fonction, j’ai utilisé HashTable.Values.CopyTo() pour pallier au problème … je mentais pas quand je disait que j’ai fait une horreur. (oui j’ai honte )
Pour vous donnez un orde de grandeur la hashlist contient typiquement quelques millier s d’éléments et j’en ai besoin d’une dizaine.
Une autre idée que j’ai eu c’est d’approximer c’est d’approximer vers le haut le nombre d’éléments à prendre, de tirer les numéros avant, de les trier de tous les récupérer en une itération. Ou alors de maintenir le vecteur obtenu avec CopyTo dans un cache.
Vous en pensez quoi?
Vous connaissez un autre moyen de réaliser cela?
Vous connaissez un hack pas trop dégeux?
Je suis preneur de tout conseil, merci d’avance.