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 :

Modifier un élément d'un foreach dans la même boucle [Débutant]


Sujet :

C#

  1. #1
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut Modifier un élément d'un foreach dans la même boucle
    Bonjour à tous

    1 - J'ai récupéré une liste de dossiers dans un tableau
    2 - Puis je ne veux conserver que le nom des dossiers, sans le chemin
    3 - Ensuite, je veux remplacer l'ancienne valeur (avec le chemin) par la nouvelle (sans le chemin)

    Pour cela, j'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                Byte boff
                String folder
                String[] versionZips = Directory.GetDirectories(stringPath)
    
    
                foreach (string versionZip in VersionZips)
                {
                    // Split the directory
                    boff = Convert.ToByte(versionZip.LastIndexOf('\\'));
                    folder = versionZip.Substring(boff + 1);
                    versionZip = folder;
    
                }
    L'erreur est : "Readonly local variable canot be used as an assigment target"

    Je pense que l'objet versionzip dans la boucle foreach est d'office en readonly
    Est-ce vrai ?

    En plus, je pense que je peux faire cela bien mieux via une expression lambda ...
    Pourriez-vous me mettre sur la voir svp ?
    Quelles sont les solutions ?
    Comment feriez-vous cela ?

    je suis en C#, VS 2010, pour un service WCF... what else ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Passe par une boucle for, tu n'auras pas ce problème.
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  3. #3
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    merci de ta réponse
    en fait je viens de faire cela :

    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
                Byte boff
                String folder
                String[] versionZips = Directory.GetDirectories(stringPath)
    
                List<string> newVersionZips = new List<string>();
    
                foreach (string versionZip in VersionZips)
                {
                    // Split the directory
                    boff = Convert.ToByte(versionZip.LastIndexOf('\\'));
                    folder = versionZip.Substring(boff + 1);
                    
                    newVersionZips.Add(folder); 
    
                }
    Je préfère passer par une liste, vu ses avantages.
    Je peux ensuite rebasculer vers un tableau si j'en ai besoin me semble t-il

    Mais il me semble que je peux transformer ce foreach en expression lambda à présent

    Une idée ?

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,
    tu as raison de préférer les listes, les tableaux n'ont que très peu d'intérêt.

    Citation Envoyé par Hepil Voir le message
    Mais il me semble que je peux transformer ce foreach en expression lambda à présent

    Une idée ?
    Of course, c'est la base de Linq
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var result = VersionZips.Select(dir =>
                {
                    // Split the directory
                    boff = Convert.ToByte(dir.LastIndexOf('\\'));
                    return dir.Substring(boff + 1);
                }).ToList();
    Sinon, plutôt que tripatouiller des chaines, tu peux utiliser cette methode, qui te renvoie des DirectoryInfo, dont la propriete Name contient ce que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var names = new DirectoryInfo(path).GetDirectories().Select(info => info.Name).ToList();
    ಠ_ಠ

  5. #5
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    Je savais qu'il y avait encore des gens doués sur terre ...
    Mais où sont-ils?

    Merci à toi ôhh Guulh

    Plus sérieusement, je vais étudier de suite ton code et je t'en remercie
    Je reviens ici après bien sûr ...

  6. #6
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    PS : Pour avoir le Select du tableau, il faut ajouter la référence :
    Mais j'ai un souci :

    Citation Envoyé par Guulh Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var result = VersionZips.Select(dir =>
                {
                    // Split the directory
                    boff = Convert.ToByte(versionZip.LastIndexOf('\\'));
                    return versionZip.Substring(boff + 1);
                }).ToList();
    ...
    dans ce cas de figure, on ne trouve plus versionZip ... il est en erreur, vu qu'il faisiat partie de la boucle foreach ...

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Change par dir , ou sinon modifie dir par versionZip.

  8. #8
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par micka132 Voir le message
    Change par dir , ou sinon modifie dir par versionZip.
    oui c'est ce que j'ai fait... pardon

    dur dur le lundi matin ... comme tous les lundis d'ailleurs désolé

  9. #9
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    Merci. Pour la suite, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                var result = VersionZips.Select(versionZip =>
                {
                    // Split the directory
                    boff = Convert.ToByte(versionZip.LastIndexOf('\\'));
                    return versionZip.Substring(boff + 1);
                }).ToList();
    Mais j'ai aussi mon ancien code qui utilisait le tableau précédent.
    Je dois à présent utiliser la nouvelle liste :

    mon ancien code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string[] cleanVerZip = Array.FindAll<string>(VersionZips, p => IsVersion(p));
    J'essaie d'utiliser la nouvelle liste 'result'

    PS : IsVersion(p) est juste une function (méthode) de validation annexe.



    j'ai pensé à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var cleanVerZip = result.Where((p=>IsVersion(p)));

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    oups micka 132, t'as raison; je corrige mon post pour ne pas induire la postérité en erreur

    Hepil: les méthodes comme Array.FindAll ou List.FindAll date d'une époque ou Linq n'était pas disponible. Elles fonctionnent bien sûr toujours, mais il est plus simple et plus flexible de passer par Linq.

    Dans ton cas, tu peux donc écrire, en mettant tout ensemble:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var result = VersionZips.Select(dir =>
                {
                    ...
                })
                .Where(dir => IsVersion(dir))
                .ToList();
    Ou pour reprendre ma version simplifiée (pas testée j'avoue),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var names = new DirectoryInfo(path).GetDirectories().Select(info => info.Name).Where(IsVersion).ToList();
    Linq permet de faire du code concis, ça vaut la peine de l'apprendre. Je te conseille notamment cette page, qui présente la plupart des opérateurs et leur usage.
    ಠ_ಠ

  11. #11
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Points : 188
    Points
    188
    Par défaut
    superbe

    merci pour tes précisions, mais surtout de ton suivi et de ton écoute.
    j'en prends note et je consulte la documentation de manière urgente

    Je n'avais pas encore trouvé de doc "progressive" sur ce sujet

    merci à tous les autres aussi

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

Discussions similaires

  1. [XL-2007] Deux variables dans une même boucle
    Par swiMa dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/05/2014, 15h57
  2. [Débutant] Résultat d'un foreach dans un même tableau
    Par traz0m dans le forum C#
    Réponses: 3
    Dernier message: 11/01/2013, 18h57
  3. itération sur deux tableaux dans la même boucle
    Par romson2 dans le forum Struts 2
    Réponses: 0
    Dernier message: 06/06/2012, 09h06
  4. [Débutant] Plusieurs opérations dans la même boucle
    Par Zakkounet dans le forum VB.NET
    Réponses: 6
    Dernier message: 01/02/2012, 17h05
  5. modifier un élément d'une form dans une méthode d'une autre form
    Par baldebaran dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/08/2009, 13h59

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