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 :

Action<> et ForEach sur tableau


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut Action<> et ForEach sur tableau
    Bonjour

    J'ai codé ces quelques lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    RegistryKey r = null;
    Action<string> init = (s) => 
    {
        string p = (string)r.GetValue(s);
        if (String.IsNullOrEmpty(p))
            r.SetValue(s, String.Empty);
    };
     
    r = user;
    Array.ForEach(new string[3] { "login", "password", "lang" }, init);
    Sachant que user est un RegistryKey, est-il possible d'éviter l'utilisation de la variable r pour utiliser user dans ma méthode ?

    J'ai tenté diverses manières pour rajouter le RegistryKey en paramètre mais rien ne va.

    Papy !

  2. #2
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    En partant du principe que user est déclaré et initialisé avant tu peux écrire ceci il me semble (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Action<string> init = s =>
    {
        string p = (string)user.GetValue(s);
        if (string.IsNullOrEmpty(p))
            user.SetValue(s, "");
    };
    Array.ForEach(new string[] { "login", "password", "lang" }, init);
    Tu pourrais même te passer de init, si c'est pour un "one-shot" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Action<string> init = s =>
    {
        string p = (string)user.GetValue(s);
        if (string.IsNullOrEmpty(p))
            user.SetValue(s, "");
    };
    Array.ForEach(new string[] { "login", "password", "lang" }, s =>
    {
        string p = (string)user.GetValue(s);
        if (string.IsNullOrEmpty(p))
            user.SetValue(s, "");
    });
    Après si tu veux mettre le RegistryKey en paramètre également rien ne t'empêche d'écrire quelque chose dans ce style (moi je trouve ça bof personnellement principalement parce que j'évite les lambdas à plusieurs paramètres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Action<RegistryKey, string> init2 = (r, s) =>
    {
        string p = (string)r.GetValue(s);
        if (string.IsNullOrEmpty(p))
            r.SetValue(s, "");
    };
     
    // si quelqu'un a une version avec le Array.ForEach ??
    foreach (string s in new string[] { "login", "password", "lang" })
        init2(user, s);
    Personnellement (si tant est que ça puisse avoir une utilité ici en terme de réutilisabilité), si je devais paramétrer le RegistryKey, j'opterais plutôt vers une technique courante en programmation fonctionnelle, la curryfication ce qui donnerait ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Func<RegistryKey, Action<string>> initCurried = r => s =>
    {
        string p = (string)r.GetValue(s);
        if (string.IsNullOrEmpty(p))
            r.SetValue(s, "");
    };
     
    Array.ForEach(new string[] { "login", "password", "lang" }, initCurried(user));
    Cordialement !

  3. #3
    Membre Expert

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Je voulais pouvoir le réutiliser sur différentes clés, d'où le passage par la variable r utilisée dans le délégué.

    Dans une boucle foreach, oui, ça doit le faire. Mais ce que je me demandais, c'était justement dans le cas du Array.ForEach.

    Par contre, je ne connaissais pas la dernière méthode que tu proposes.
    Je vais tester ça.


    ...........

    ça fonctionne bien. Merci pour cette nouvelle connaissance !

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

Discussions similaires

  1. Boucle foreach sur tableau devenu inaccessible
    Par Lhtldrn dans le forum C#
    Réponses: 1
    Dernier message: 08/07/2012, 11h23
  2. Foreach sur un tableau sauf certaines valeurs
    Par ju0123456789 dans le forum Langage
    Réponses: 0
    Dernier message: 15/07/2010, 11h23
  3. Actions souris sur tableau Flex de ActiveX
    Par zeus7857 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 13/08/2008, 14h42
  4. foreach sur un tableau à plusieurs dimensions
    Par Peanut dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2007, 14h04
  5. Réponses: 25
    Dernier message: 16/07/2003, 20h41

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