|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Allan Inscription : mars 2011 Messages : 14 ![]() |
Bonjour a tous,
![]() voilà le titre est assez explicite, comment faire un .ContainsKey dans une hashtable avec une expression régulière ? Par exemple: Code :
En vous remerciant par avance de votre aide
|
||
|
|
00
|
|
|
#2 |
![]() ![]() Thomas LevesqueDéveloppeur .NET Inscription : février 2004 Messages : 16 748 ![]() |
Il n'y a pas d'autre moyen que de parcourir toute la hashtable. Si tu regardes comment une hashtable est construite, tu comprendras vite pourquoi...
Quelques centaines ou milliers, c'est pas grand chose, ça ira très vite... Ca ne deviendra problématique que si tu effectues cette recherche très souvent.
__________________
Pas de questions techniques par MP ! Le forum est là pour ça... |
|
00
|
|
|
#3 | ||
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 364 ![]() |
A priori je procéderai comme ça :
Code C# :
EDIT : Je n'avais pas fait attention... tu fais ta recherches sur la clé, mais tu veux la valeur...
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Allan Inscription : mars 2011 Messages : 14 ![]() |
@tomlev,
Merci pour ta réponse, effectivement cette opération de recherche sera effectuer assez souvent... Y'a t'il un autre système pour faire cette recherche rapidement ? Par exemple utilisé les tableaux Array ? @Er3van, Merci mais j'utilise VB.Net pas C#.. ! ;\ |
|
|
00
|
|
|
#5 | ||
![]() ![]() Thomas LevesqueDéveloppeur .NET Inscription : février 2004 Messages : 16 748 ![]() |
Citation:
Citation:
http://www.developerfusion.com/tools.../csharp-to-vb/
__________________
Pas de questions techniques par MP ! Le forum est là pour ça... |
||
|
00
|
|
|
#6 |
|
Invité de passage
![]() Allan Inscription : mars 2011 Messages : 14 ![]() |
@tomlev
Merci encore pour ta réponse, bien alors tu m'as convaincu de procéder a une boucle avec IDictionaryEnumerator ! Car cette opération sera exécuté par l'utilisateur, ça peux aller jusqu'à 5 fois par secondes je pense. En faite, je développe un client IRC, et cette recherche sur hashtable se fera quand l'utilisateur commence a écrire quelques lettres et qu'il appuie sur la touche TAB, ce qui fera cette boucle pour aller chercher le pseudo de la personne pour l'écrire dans la textbox. Pourquoi utiliser hashtable, car il me semble que c'est le moyen le plus rapide pour stocker et récupérer des données stocké. Cette hashtable contient "lePseudo" en key et en value "lePseudo!ident@host.fr" a chaque fois que quelqu'un fais une action sur le réseaux irc, je stock c'est information s'il n'y sont pas déjà présente. Voilà ! Merci encore ![]() EDIT : J'viens de réfléchir .. (oui ça m'arrive parfois) J'vais pas faire une boucle sur le hashtable mais sur la nicklist des personnes connecter au salon (!) Car sinon il va me sortir des personnes non connecter.. xD |
|
|
00
|
|
|
#7 | |||||||||
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 364 ![]() |
Pour info, je viens de faire un petit test, car ça me titillait...
J'alimente le Dictionnaire et le Hastable avec 100 000 entrées. Code c# :
Ensuite, je récupère via un IDictionaryEnumerator dans le hashtable : Code C# :
Et après, je fais de même, avec Linq, dans mon dico : Code C# :
Et j'obtiens le résultat suivant : Citation:
Seulement, si ne caste pas en List<String> mon résultat Linq (puisqu'on ne veut que lire de toute façon), j'obtiens cela : Citation:
Et si je passe à 1 million d'entrées, ça fait x10 pour le hashtable, mais seulement x1,3 pour le dictionnaire : Citation:
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
|||||||||
|
|
00
|
|
|
#8 | |||||||||
|
Membre chevronné
![]() ![]() Mickaël Développeur .NET Inscription : octobre 2008 Messages : 404 ![]() |
Bonjour,
Quelques remarques sur ce dernier code : Il vaudrait mieux compiler la Regex (RegexOptions.Compiled en second param du constructeur) si elle doit servir souvent Créer un seul générateur de nombres aléatoires (un seul new Random avant le chrono) améliorerait peut-être le temps de remplissage La différence d'écart sans appel à ToList pour Linq provient du fait que les résultats ne sont pas évalués, c'est juste la création d'une "requête" qui enverra les données quand elles seront nécessaires (foreach, calculs (agrégats), etc.) cela revient au même que comparer la création d'un string contenant une requête SQL ("SELECT ...") avec l'exécution de celle-ci Finalement, je me suis décidé à faire quelques tests (sauf que je finis avec du code un brin complexe ... influence F# sort de ce )Code :
Code :
J'use au passage du yield return ce qui me permettra de montrer que ce n'est pas spécifiquement Linq le "problème" mais plutôt l'évaluation tardive. Viens enfin le code principal : Code :
Le tout s'effectue au sens de ma méthode de mesure (par le biais d'une lambda) ainsi le temps sera utilisé par la continuation que je passe en second paramètre, qui se contente de l'afficher. Et c'est là qu'on arrive au truc qui fait peur (que je pourrais sans doute factoriser)Code :
En fait c'est la continuation qui les utilisent ; et effectue une autre mesure du nombre d'éléments ; à noter que la méthode d'extension Count() utilisée ici à une implémentation différente pour IEnumerable et List, pour le premier elle énumère en incrémentant un compteur ; pour la seconde elle récupère juste la propriété Count de la List. Cette mesure là ne "récupère" que le temps (j'aurais pu récupérer aussi le nombre d'éléments mais il était inutile pour moi ici). Ainsi la seconde continuation (grâce au jeu des "closure" a accès aux deux temps ; que j'affiche, ce qui permet de voir un peu mieux où se fait vraiment l'itération des résultats. Ainsi chez moi, voici ce que j'obtiens: Citation:
P.S. j'offre ceci si vous avez tout lu, tout compris, et que vous trouvez mon code joli
__________________
Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )À quelle heure dormez-vous ? |
|||||||||
|
|
10
|
|
|
#9 |
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 364 ![]() |
Mouhahaha, je veux le cookie !
En fait je me suis mal exprimé... je ne voulais pas dire que Dico+Linq était plus rapide en soit, ma conclusion s'était bien que ça mettait 50% de plus dans le cas nominal, mais qu'en soit ce n'est pas si horrible. Pis le code pour l'alimentation c'était juste pour mettre des données dedans, les perf de ce bout de code ne m'intéressait guère, mais en effet, ça peut s'améliorer. Ma dernière partie n'était pas très utile, ou alors j'aurais du préciser qu'avec un Array on divisait quand même par 5 le temps d’exécution et que c'était vraiment la liste le problème... bref. Mais du coup ton code est très intéressant. Si je comprends tout ce que tu as fais, ça confirme quand même que la hastable n'est pas performante dans ce cas d'utilisation (si on fait la somme des deux temps on arrive toujours au dessus). J'ai un peu de mal à comprendre le "cont()" dans Measure ceci étant... :/
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
|
|
00
|
|
|
#10 | ||||||||
|
Membre chevronné
![]() ![]() Mickaël Développeur .NET Inscription : octobre 2008 Messages : 404 ![]() |
C'est ce qu'on appelle une continuation
perso j'ai vu ça depuis que je regarde de la programmation fonctionnelle, et je l'adapte parfois ailleurs (C# a de plus en plus de fonctionnalités fonctionnelles )J'aurais très bien pu faire ma méthode Measure comme ceci : Code C# :
Code C# :
Ainsi pour faire un exemple simple et court (afin d'éviter de trop dévier le sujet) et donc présentant très peu d'intérêt tel quel. Si on a ce code "classique" Code C# :
Code C# :
Après j'aurais très bien pu m'en passer, mais 1) j'aime bien 2) je trouve ça plus clair (mais c'est très subjectif) 3) vu le type de progression du langage (introduction graduelle de concept "fonctionnels" (même si les continuations c'est pas spécifiquement du paradigme fonctionnel)) ça peut pas faire de mal de jongler avec. Cordialement !
__________________
Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )À quelle heure dormez-vous ? |
||||||||
|
|
10
|
Copyright © 2000-2012 - www.developpez.com