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

C# Discussion :

Utilisation de foreach


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut Utilisation de foreach
    Bonjour,

    Lorsque j'utilise le foreach avec des tableaux, j'ai parfois besoin de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int i = 0;
    foreach (Element e in Elements)
    {
    	Tab[i] = Element.Data;
    	i++;
    }
    A l'intérieur d'une boucle foreach, existe t'il un mot clé représentant ma variable d'incrémentation i ?

    Merci

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Non, il n'y a pas de variable d'incrémentation dans un foreach.

    Après, es-tu obligé d'utiliser un tableau ? Si ce sont des List<T> tu peux écrire ton code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<int> Tab = Elements.ConvertAll<int>(delegate (Element e) { return e.Data; });
    Et Si tu utilises C# 3, tu as Linq à ta disposition, qui permet de l'écrire de façon encore plus concise (mais là, n'ayant pas beaucoup utilisé Linq, je laisse plus compétent que moi te le montrer )

  3. #3
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Pourquoi ne pas utiliser une boucle for tout simplement ?
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  4. #4
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Je suis d'accords avec toi dans ce cas la boucle for est plus intéressante. Mais s'il y avait eu une variable d'incrémentation disponible le foreach était mieux.

    @Guulh : Je suis obligé d'utiliser des tableaux mais ta solution est bien plus élégante.

    Merci beaucoup pour vos réponse.

  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 : 44
    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
    Juste pour info, des solutions possibles avec Linq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var Tab = Elements.Select(e => e.Data).ToList();
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var Tab = (from e in Elements
               select e.Data).ToList();
    (exactement équivalent à la version précédente, mais avec la syntaxe de requête)

    Et la solution de Guulh avec la syntaxe C# 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var Tab = Elements.ConvertAll(e => e.Data);
    (pas besoin de spécifier le paramètre de type générique, grâce à l'inférence de type)

  6. #6
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Juste pour info, des solutions possibles avec Linq
    J'ajoute que la List<T> a une méthode ToArray (qui renvoie un T[]), et qu'il existe aussi une méthode d'extension du même nom.

    Mais bon, les tableaux, il y a TRES peu de raisons de continuer à s'en servir. Comme l'a dit un monsieur très intelligent : "In almost every case, there is a better tool to use than an array."
    http://blogs.msdn.com/ericlippert/ar...t-harmful.aspx

  7. #7
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Mais bon, les tableaux, il y a TRES peu de raisons de continuer à s'en servir
    Voici un exemple ou a mon avis (meme si je suis friand des listes, un tableau est plus mieux)

    Je dispose d'une collection de +/- 40.000 elements d'une classe
    Chaque element de cette classe PEUT avoir un tableau de maximum 6 KeyValuePair String,int

    Il me semble que 40.000 Array seront moins couteux que 40000 Listes ?

  8. #8
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par olibara Voir le message
    Il me semble que 40.000 Array seront moins couteux que 40000 Listes ?
    Coûteux en quoi ? En mémoire ? Pas sûr.
    Déjà, je suis pas persuadé que la différence soit très sensible si on ne manipule que des dizaines de milliers d'éléments (pour des millions ou dizaines de millions, peut être).
    Et si la plupart de tes arrays ne contiennent que un ou deux éléments, ça fait pas mal de place de perdue, non ? Alors que si tu crées des listes, voire même que tu forces leur capacité à 2 ou 4, ça prendra moins de place.

  9. #9
    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 : 44
    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 olibara Voir le message
    Il me semble que 40.000 Array seront moins couteux que 40000 Listes ?
    Pour des petits tableaux, effectivement c'est moins couteux. Pour des grands tableaux, la différence est minime : une liste, c'est finalement juste un wrapper autour d'un tableau, il y a juste quelques champs en plus. Par exemple si tu regardes la classe List<T> avec Reflector :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        // Fields
        private const int _defaultCapacity = 4; // statique, donc on s'en fout
        private static T[] _emptyArray;  // statique, donc on s'en fout
        private T[] _items; // le tableau qui contient les données
        private int _size; // le nombre d'éléments
        [NonSerialized]
        private object _syncRoot; // pour la synchronisation en multithread
        private int _version; // je sais pas trop pourquoi
    Donc au final, tu as juste 3 champs en plus par rapport à un simple tableau. Par contre, le tableau _items est généralement plus grand que nécessaire (pour ne pas avoir besoin de l'agrandir à chaque fois qu'on ajoute un élément). Donc pour un grand nombre d'éléments, le coût des champs supplémentaires et de l'espace inutilisé du tableau n'est pas très important par rapport à l'espace occupé par les éléments eux-mêmes

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Tomlev le spécialiste Reflector

    Ce que tu montre confirme asser bien que mon option dans le contexte donné est bonne.

    Par contre je découvre que la List c'est un simple Wrapper sur un tableau
    (tableau de reference certainement)
    J'avais cru (mais c'etait idiot) qu'il s'agissait de liste chainées

  11. #11
    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 : 44
    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 olibara Voir le message
    J'avais cru (mais c'etait idiot) qu'il s'agissait de liste chainées
    Ca existe aussi
    http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx

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

Discussions similaires

  1. [PHP 4] Utilisation de "foreach"
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 22/02/2009, 13h36
  2. prob utilisation c:forEach
    Par skanderb dans le forum JSF
    Réponses: 1
    Dernier message: 27/04/2007, 11h06
  3. Utilisation de foreach avec les sessions sous PHP5
    Par frochard dans le forum Langage
    Réponses: 1
    Dernier message: 11/11/2006, 02h14
  4. [Tableaux] Erreur lors de l'utilisation de foreach
    Par kagura dans le forum Langage
    Réponses: 1
    Dernier message: 08/11/2006, 13h51
  5. utilisation du Foreach.
    Par LESOLEIL dans le forum Langage
    Réponses: 5
    Dernier message: 15/03/2006, 15h26

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