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

Bases de données Delphi Discussion :

ClientDataSet TStringList IndexOf


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut ClientDataSet TStringList IndexOf
    Bonjour,

    Y a-t-il une autre méthode plus rapide pour ajouter des données dans une TStringList index sans doublons ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PickList.Items.BeginUpdate;
    while not ClientDataSet.Eof do
    begin
      if ClientDataSet.Fields.FieldByName('MyCol').AsString <> EmptyStr then
      begin
        if ListBox.Items.IndexOf(ClientDataSet.Fields.FieldByName('MyCol').AsString) = -1 then
          ListBox.Items.Add(ClientDataSet.Fields.FieldByName('MyCol').AsString);
      end;
     
      Next;
    end;
     
    PickList.Items.EndUpdate;
    J'ai testé avec une base de données qui contient 30000 données, le traitement prend pas mal de temps (~40 Secondes), sans le IndexOf ça prend ~2 secondes.

    Merci
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  2. #2
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut
    Je pense avoir trouvé mon bonheur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    List := TStringList.Create;
    List.Sorted := True;
    List.Duplicates := dupIgnore;
     
    while not ClientDataSet.Eof do
    begin
      if ClientDataSet.Fields.FieldByName('MyCol').AsString <> EmptyStr then
        List.Add(ClientDataSet.Fields.FieldByName('MyCol').AsString);
     
      Next;
    end;
     
    ListBox.Items := List;
    List.Free;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Les plus rapide serait sans doute d'utiliser une THashedStringList (inifiles.pas) avec IndexOf.

  4. #4
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Les plus rapide serait sans doute d'utiliser une THashedStringList (inifiles.pas) avec IndexOf.
    Bonjour Andnotor,

    J'ai testé avec THashedStringList, Le traitement dur plus (~40 Secondes) le IndexOf fait mouliné le traitement, au final cela revient au mème d’utiliser directement une TListbox ou une TStringList avec l'IndexOf.

    Après c'est bizarre, j'ai jeté un coup œil à la doc de la THashedStringList, elle est censé être beaucoup plus performante que la TStringList.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List := THashedStringList.Create;
    while not ClientDataSet.Eof do
    begin
      if ClientDataSet.Fields.FieldByName('MyCol').AsString <> EmptyStr then
      begin
        if List.IndexOf(ClientDataSet.Fields.FieldByName('MyCol').AsString) = -1 then
          List.Add(ClientDataSet.Fields.FieldByName('MyCol').AsString);
      end;
     
      Next;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TStringList] Optimisation du IndexOf ?
    Par Bruno13 dans le forum Delphi
    Réponses: 15
    Dernier message: 09/07/2007, 14h35
  2. [Tstringlist] Retrouvez la liste....
    Par remixtech dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 23h05
  3. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57
  4. TStringList en array of string
    Par JediKerian dans le forum Langage
    Réponses: 2
    Dernier message: 20/03/2003, 15h37
  5. TStringList
    Par giaco dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/09/2002, 13h50

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