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

Langage Delphi Discussion :

Dernier élément boucle for .. in


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 505
    Points : 3 135
    Points
    3 135
    Par défaut Dernier élément boucle for .. in
    Hello

    Quand on utilise un for..in , par exemple for "TPair<string, string>" in "TDicionnary<string, string>", est-ce qu'on peut savoir si on est sur le dernier élément de la boucle avant d'en sortir ?

    Typiquement, je veux concaténer une chaîne et rajouter un caractère de fin à chaque tour de boucle mais pas sur le dernier élément.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 843
    Points : 13 615
    Points
    13 615
    Par défaut
    Pas directement, mais il est toujours possible de faire une boucle for..to en utilisant ToArray.

    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
    var
      PairArray :TArray<TPair<string,string>>;
      Dico      :TDictionary<string,string>;
      i         :Integer;
     
    begin
      Dico := TDictionary<string,string>.Create;
      Dico.Add('Key1', 'Value1');
      Dico.Add('Key2', 'Value2');
      Dico.Add('Key3', 'Value3');
     
      PairArray := Dico.ToArray;
     
      for i := 0 to high(PairArray) do
        Memo1.Lines.Add(PairArray[i].Key +' = ' +PairArray[i].Value);
     
      Dico.Free;
    end;
    Sinon, il est parfois plus simple et moins coûteux en temps (suivent le nombre d'élément) d'ajouter systématiquement le caractère de fin et de supprimer le dernier après la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Text := '';
     
    for Pair in Dico do
      Text := Text +Pair.Key +'=' +Pair.Value +';';
     
    SetLength(Text, Length(Text) -1);

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 505
    Points : 3 135
    Points
    3 135
    Par défaut
    Ma curiosité naturelle me poussait à chercher une solution simple du style
    if IsLast(element) then ...
    Mais si 'il faut passer par un tableau, je boucle directement sur chaque élément et ça va très bien. :-)

    peut-être en passant par un while ... je vais regarder.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 466
    Points
    28 466
    Par défaut
    ce que je fais parfois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Text := '';
     Sep := '';
    for Pair in Dico do
    begin
      Text := Text + Sep + Pair.Key +'=' +Pair.Value;
      Sep := ';';
    end;

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 730
    Points : 25 637
    Points
    25 637
    Par défaut
    Ce que je fais en général, j'utilise une TStringList puis CommaText, cela évite de se prendre la tête avec le dernier séparateur !
    Et que fait CommaText, cela utilise la technique de Andnotor en retirant le dernier caractère, j'avais même fait une ReduceStr pour améliorer cela en D7 sans FastMM

    Sinon TDictionnary possède Count et Items, pourquoi passer par un ToArray ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i := 0 to Dico.Count - 1 do
    begin
      Text := Text + Dico.Keys[i] + '='+ Dico.Values[i];
     
      if i < Dico.Count - 1 then
        Text := Text + ';'
    end;
    ou alors, une variante un peu comme celle Paul en ajoutant le séparateur avant la donnée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if Count > 0 then
    begin
      Text := Items[0];
      for i := 1 to Count - 1 do  
        Text := Text + "," + Items[i];
    end;
    En Delphi, ils ont simplifiés les iterators à l'extrème, en gros c'est juste un while,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      Iterator: TPairEnumerator;
    begin
      Iterator = Dico.GetIterator();
      while Iterator.MoveNext() do
        Text := Text + Iterator.Curent.Key + '='+ Iterator.Curent.Value + ';'
    Mais il manque par rapport au c++, une fonction comme map::end() qui donne le dernier élement !



    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
     
      typedef std::map<String, String> TStringStringMap;
      TStringStringMap Dico;
     
      Dico["Key1"] = "Value1";
      Dico["Key2"] = "Value2";
      Dico["Key3"] = "Value3";
     
      for (TStringStringMap:const_iterator it = Dico.begin() ; it != Dico.end(); it++)
      {
         Text += it->first + ";" + it->second;
     
          if (it != Dico.end())
            Text += ";"
      }

Discussions similaires

  1. [XE2] Modifier un élément d'une boucle for..in
    Par Papy214 dans le forum Langage
    Réponses: 7
    Dernier message: 19/11/2011, 22h01
  2. Boucle for - afficher élément un après l'autre
    Par SkyBlast dans le forum Android
    Réponses: 2
    Dernier message: 18/07/2011, 17h55
  3. Réponses: 5
    Dernier message: 05/07/2011, 15h45
  4. Réponses: 5
    Dernier message: 30/05/2007, 19h08
  5. for-each et dernier élément
    Par neptune dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/09/2005, 15h53

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