IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Hashtable.ContainsKey(Expression régulière) ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 17
    Par défaut Hashtable.ContainsKey(Expression régulière) ?
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public leHashTable As New Hashtable()
    Dim reg As New Regex("aKey")
     
    leHashTable.Add("maKey1", "maValue1")
    leHashTable.Add("Key2", "Value2")
     
    leHashTable.ContainsKey(reg) 'dois resortir maValue1
    Dois-je faire un boucle avec IDictionaryEnumerator pour y arriver ? ça me parait assez lourd vue que ma hashtable peux contenir des centaines voir millier d'entrée.. ;\

    En vous remerciant par avance de votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    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...

    Citation Envoyé par Allan007 Voir le message
    ça me parait assez lourd vue que ma hashtable peux contenir des centaines voir millier d'entrée.. ;\
    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.

  3. #3
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    A priori je procéderai comme ça :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<String> matches = leHashTable.Values.Cast<String>().ToList().FindAll(u => reg.Match(u).Success);

    EDIT : Je n'avais pas fait attention... tu fais ta recherches sur la clé, mais tu veux la valeur...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 17
    Par défaut
    @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#.. ! ;\

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Allan007 Voir le message
    Merci pour ta réponse, effectivement cette opération de recherche sera effectuer assez souvent...
    C'est quoi "assez souvent" ? Si c'est en réponse à une action de l'utilisateur (même si c'est une action fréquente), ce n'est pas ce que j'appelle souvent... "souvent", ce serait plusieurs fois (voire plusieurs centaines de fois) par seconde.

    Citation Envoyé par Allan007 Voir le message
    Y'a t'il un autre système pour faire cette recherche rapidement ? Par exemple utilisé les tableaux Array ?
    Ce sera peut-être un peu plus rapide avec un tableau, mais je suis même pas sûr... As-tu une raison particulière d'utiliser une hashtable ?

    Citation Envoyé par Allan007 Voir le message
    Merci mais j'utilise VB.Net pas C#.. ! ;\
    http://www.developerfusion.com/tools.../csharp-to-vb/

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 17
    Par défaut
    @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

  7. #7
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    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# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    var hashTable = new Hashtable();
    Dictionary<string, string> dico = new Dictionary<string, string>();
    List<string> resultsHasTable = new List<string>();
    System.Text.RegularExpressions.Regex searchTerm = new System.Text.RegularExpressions.Regex("11");
     
    Stopwatch sw = Stopwatch.StartNew();
     
    int oldR1 = 0;
    try
    {
          for (int i = 0; i < 100000; i++)
          {
                int r1 = oldR1 + new Random().Next(1, 10);
                int r2 = new Random().Next(0, r1);
                oldR1 = r1;
     
                hashTable.Add(r1.ToString(), r2.ToString());
                dico.Add(r1.ToString(), r2.ToString());
           }
    }
    catch (Exception ex)
    {
           ResultsTextBox.Text += "Ex : " + ex.Message;
    }
     
    sw.Stop();
    ResultsTextBox.Text += "\nRemplissage : " + sw.Elapsed ;

    Ensuite, je récupère via un IDictionaryEnumerator dans le hashtable :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    sw.Reset();
    sw.Start();
    IDictionaryEnumerator ide = hashTable.GetEnumerator();
    while(ide.MoveNext()) {
    	if (searchTerm.Match((String)ide.Key).Success)
    	{
    		resultsHasTable.Add((String)ide.Value);
    	}
    }
     
    sw.Stop();
    ResultsTextBox.Text += "\nRécupération des valeurs via clé avec Hashtable/IDictionaryEnumerator : " + sw.Elapsed;

    Et après, je fais de même, avec Linq, dans mon dico :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sw.Reset();
    sw.Start();
    var resultDico = dico.Where(u => searchTerm.Match(u.Key).Success).Select(i => i.Value).ToList();
    sw.Stop();
    ResultsTextBox.Text += "\nRécupération des valeurs via clé avec Dico/Linq : " + sw.Elapsed;

    Et j'obtiens le résultat suivant :
    Remplissage : 00:00:01.1639071
    Récupération des valeurs via clé avec Hashtable/IDictionaryEnumerator : 00:00:00.0243843
    Récupération des valeurs via clé avec Dico/Linq : 00:00:00.0325695
    Donc un écart d'environ 50%.
    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 :

    Remplissage : 00:00:01.0785094
    Récupération des valeurs via clé avec Hashtable/IDictionaryEnumerator : 00:00:00.0259971
    Récupération des valeurs via clé avec Dico/Linq : 00:00:00.0006187
    Donc un écart de 1 pour 40. (Il y a bien autant de valeurs dans les deux résultats)
    Et si je passe à 1 million d'entrées, ça fait x10 pour le hashtable, mais seulement x1,3 pour le dictionnaire :

    Remplissage : 00:00:12.0008506
    Récupération des valeurs via clé avec Hashtable/IDictionaryEnumerator : 00:00:00.3174830
    Récupération des valeurs via clé avec Dico/Linq : 00:00:00.0008470
    Peut-être y a-t-il moyen d'améliorer le code pour la récupération des données dans le hashtable, ou alors j'ai raté un truc...

Discussions similaires

  1. [RegEx] Expression régulières : Balises <SCRIPT>
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 23h25
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo