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

Delphi .NET Discussion :

Insérer (partiellement) une collection dans une "List<T>"


Sujet :

Delphi .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut Insérer (partiellement) une collection dans une "List<T>"
    Bonjour, je précise que je débute en delphi et delphi .net. Initialement, j'ai commencé mon projet en delphi Win32. Or, j'ai besoin de nombreuses collections et celles de la VCL ou la DCL ne me sont pas suffisantes. Qui plus est, originaire du monde "java et c++", j'ai plus de faciliter à appréhender le template de .net pour Delphi que celui Win32.

    Voici le soucis auquel je suis confronté:

    je cherche une structure de données me permettant d'insérer une portion d'une collection dans ma collection. Pour l'instant j'utilise des List générique (List<t>). Y a-t-il une structure de données plus adaptée à ma problématique sachant que finalement c'est la seule opération qui me manque. Sinon, avez-vous une idée pour l'implémenter de manière efficiente (rapide et sans consommer plus de mémoire que nécessaire).

    Grosso modo, je pensais faire l'opération suivante (en pseudo code)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure InsertRange( List C , position : integer, first: integer, last : integer)
             Collection CopieC = C.Clone;
     
     // J'enlève les éléments de la collection C compris entre last  et C.Count
             CopieC .RemoveRange (last+1 , CopieC.Count
     
     // J'enlève les éléments de la collection C compris entre 0 et first
             CopieC .RemoveRange ( 0 , first-1);
     
     // J'insère ensuite la collection "vidée" des éléments de C que je ne veux pas
     //insérer dans ma List
              InsertRange( position, CopieC)
    Bon voilà c'est censé marcher sauf que:
    1: ça gaspille de la mémoire inutilement (et vu la taille des listes que je manipule c'est impensable)
    2: La création de la collection "vidées" des éléments que je ne veux pas insérer dans ma liste est couteuse en temps et c'est inutile.

    Du coup cette solution intuitive me semble de piète qualité. Sauf que, ne maitrisant pas bien le template du langage Delphi.net, je ne voit pas trop la direction à suivre.

    Quelques indications seraient donc les bienvenues.

    Cordialement,

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    à titre d'exemple, voici mon implémentation delphi.net qui ne me satisfait pas pour l'instant:

    Code : 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
    procedure TUtility.AddRange<T>( var list : List <T>  ;Coll : IEnumerable<T> ; first: integer; last : integer);
         var
            aux : List<T>;
         begin
            aux := new List<T>(Coll);
            aux.RemoveRange (last+1 , aux.Count);
            aux.RemoveRange (0 , first -1);
     
     // J'enlève les éléments de la collection C compris entre last  et C.Count
             aux .RemoveRange (last+1 , aux.Count);
     
     // J'enlève les éléments de la collection C compris entre 0 et first
             aux .RemoveRange ( 0 , first-1);
     
     // J'insère ensuite la collection "vidée" des éléments de C que je ne veux pas
     //insérer dans ma List
              list.AddRange(aux);
         end;
    Autre question, j'ai une liste générique de Boolean List<Boolean> et je souhaite effectuer une opération qui consiste à la redimmensionner en remplissant les nouvelles entrées crées par false (dummy entries). Avez-vous une idée de la démarche à suivre ?

    Considérons que la taille de ma liste est m et que je souhaite l'agrandir à une taille n. Une solution (pas très élégante) pour obtenir mon résultat serait de rajouter (n-m) Boolean false à la liste. Cependant, j'imagine qu'il est possible de faire mieux, en terme de rapidité et d'esthétique du code. Est-ce que si je fixe Capacity et Count à la nouvelle taille (n), ça suffira à remplir ma liste de false (valeur par défaut d'un boolean ?) ? Je pense que non ...

    D'où pour l'instant mon code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     procedure TUtility.Resize(var list : List<Boolean>; newSize : Integer);
     begin
       // pour éviter que list ne réalloue sa liste de pointer à chaque Add, on fixe capacity à sa
       // valeur finale en fin de procédure (en l'occurence newSize)
       list.Capacity := newSize;
       // A améliorer
       for i : Integer := 0 to (newSize-list.Count) do
          list.Add(false);
     end;

  3. #3
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par Benoit_T
    je cherche une structure de données me permettant d'insérer une portion d'une collection dans ma collection.
    Le tas de Fibonacci et la file binomiale sont les structures de données les plus efficaces pour l'opération de concaténation.

    Citation Envoyé par Benoit_T
    Autre question, j'ai une liste générique de Boolean List<Boolean> et je souhaite effectuer une opération qui consiste à la redimmensionner en remplissant les nouvelles entrées crées par false (dummy entries). Avez-vous une idée de la démarche à suivre ?
    Un arbre de Braun ferait certainement l'affaire, en gros c'est un tableau de dimension infinie dont tous les éléments vaudraient false par défaut.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Tout d'abord comme tu es un chanceux possesseur de Delphi 2009 je m'étonne que tu sois passé à .NET plutôt que rester en Win32 pour les génériques puisque justement une des spécificités de D2009 est de proposer les génériques pour Win32, et avec la même syntaxe que sous .NET en plus mais bon passons.

    Personnellement pour transférer une partie d'une liste dans une autre je ferais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TransferList( ASource, ACible: TList<T>, const FirstIndex, LastIndex: Integer );
    var
     Cpt: Integer;
    begin
      if FirstIndex < LastIndex then
        while (FirstIndex <= LastIndex) and (FirstIndex < ASource.Count)
        begin
          ACible.Add( ASource[FirstIndex] );
          Inc( FirstIndex );
        end;
    end;
    Ensuite pour ta deuxième question, si c'est juste une liste de booléen redimensionnable pourquoi ne pas utiliser un tableau dynamique de booléen tout simplement que je redimensionne avec un SetLength puis initialise avec un FillChar. Ha mais y'a pas en .NET...

    Enfin si tu es vraiment à la recherche de performances, je pense que tu devrais regarder du côté des propositions de SpiceGuid plutôt que d'utiliser des listes de manière conventionnelles.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Merci pour toutes ces précisions qui m'ont fort bien aidé !

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Ne pas oublier le tag résolu, si c'est le cas.

    Merci.

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

Discussions similaires

  1. [2.x] Une collection dans une collection ?
    Par Crackerz dans le forum Symfony
    Réponses: 2
    Dernier message: 25/08/2014, 21h22
  2. Réponses: 4
    Dernier message: 04/07/2010, 16h44
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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