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

Dotnet Discussion :

Rendre une méthode récursive avec Yield return


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut Rendre une méthode récursive avec Yield return
    Bonjour,

    Voici 2 méthodes, le but est de "multiplier" une liste n fois. La première méthode multiplie 2 fois ma liste alors que l'autre méthode multiplie 3 fois la liste.
    J'aimerai réussir à trouver une écriture permettant d'utiliser mon paramètre int aNombreCaractere afin d'avoir une seule méthode qui s'appelle récursivement n fois en fonction du paramètre ?

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
            public static System.Collections.IEnumerable MultiplyCaractere(int aNombreCaractere)
            {
                String locale = null;
     
                foreach (String item1 in GetAllCaractere())
                {
                    foreach (String item2 in GetAllCaractere())
                    {
                        locale = String.Format("{0}{1}", item1, item2);
                        yield return locale;
                    }
                }
            }
     
            public static System.Collections.IEnumerable MultiplyCaractere3(int aNombreCaractere)
            {
                String locale = null;
     
                foreach (String item1 in GetAllCaractere())
                {
                    foreach (String item2 in GetAllCaractere())
                    {
                        foreach (String item3 in GetAllCaractere())
                        {
                            locale = item1 + item2 + item3;
                            yield return locale;
                        }
                    }
                }
            }
    À priori, ici c'est le yield return qui me pose problème, et je ne sais pas comment m'en sortir, si vous avez des idées ?

    Merci beaucoup

  2. #2
    Membre éclairé Avatar de k4st0r42
    Homme Profil pro
    Artisan numérique
    Inscrit en
    Janvier 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisan numérique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 48
    Par défaut
    Ça risque d'être compliqué ce que tu veux faire avec un yield

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Le yield n'est pas une obligation, cependant je l'utilise pour résoudre un problème technique, en effet, si je multiplie 4 ou 5 listes, j'ai +38.000.000 enregistrements, et cela ne tient pas dans une liste (exception) d'où le yield.
    Maintenant s'il existe une autre solution pour parcourir tous mes enregistrements "à la volée" je suis preneur ^^

    édit :
    Exception of type 'System.OutOfMemoryException' was thrown.
    lstTest2 Count = 33554432 System.Collections.Generic.List<string>
    Donc après 33554432 enregistrements la liste lève une exception !

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour

    Peux tu préciser l'usage de ton aNombreCaractere ? c'est le niveau de multiplication par lui même de ton tableau de caractère ?

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Bonjour

    Peux tu préciser l'usage de ton aNombreCaractere ? c'est le niveau de multiplication par lui même de ton tableau de caractère ?
    Oui, aNombreCaractere est le nombre de fois où la liste doit être multiplier.

    Si ma liste est : A, B
    et que aNombreCaractere = 1 le résultat attendu sera : A, B
    et que aNombreCaractere = 2 le résultat attendu sera : AA, AB, BA, BB
    et que aNombreCaractere = 3 le résultat attendu sera : AAA, AAB, ect...
    chaque résultat aura un nombre de caractères égale à aNombreCaractere

    Je vais étudier la solution de Etanne, merci.

    édit: la solution de Etanne correspond bien à mes attentes. Je vais l'adapter à mon cas et tester si je n'ai pas l'exception. En tout cas ton code fonctionne bien. avec 10, c'est atrocement long (plus que ce que j'aurai cru) mais c'est bien le résultat que j'attend. Ce soir je marque [Résolu] si mes tests sont concluant.
    Merci beaucoup

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    La solution de Etanne fonctionne très bien, c'est exactement ce que j'attendais.
    Maintenant je vais jouer un peu avec les thread pour optimiser le temps de la boucle.

    Merci encore

    édit: bien que cela fonctionne, je ne comprend pas où est la récursivité ??? Peux-tu détailler les 2 méthodes que tu as écrite afin que je comprenne mieux le mécanisme ?

  7. #7
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut
    Bonjour,

    Le problème à résoudre est très intéressant !

    Voici ma solution avec Linq:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
        class Program
        {
            private const string _allChars = "abcdefghijklmnopqrstuvwxyz";
     
            private static void Main(string[] args)
            {
                var list = MultiplyCaractere(10);
     
                foreach (var val in list)
                {
                    Console.WriteLine(val);
                }
            }
     
            /// <summary>
            /// Récupérer les combinaison
            /// </summary>
            /// <param name="aNombreCaractere">Taille</param>
            /// <returns></returns>
            public static System.Collections.IEnumerable MultiplyCaractere(int aNombreCaractere)
            {
                IEnumerable<string> list = GetAllCaractere();
     
                for (var i = 1; i < aNombreCaractere; i++)
                {
                    list = from l in list from n in GetAllCaractere() select  l + n;
                }
     
                return list;
            }
     
            /// <summary>
            /// Récupérer une liste de string
            /// </summary>
            /// <returns></returns>
            private static IEnumerable<string> GetAllCaractere()
            {
                return _allChars.Select(monChar => monChar.ToString());
            }
        }
    Cela est fonctionnel ! Et vous n'aurez pas de problème de OutOfMemoryException car vous obtenez avec Linq un IEnumerable

    Peut-être que ce code peut être encore simplifié...

  8. #8
    Membre éclairé Avatar de k4st0r42
    Homme Profil pro
    Artisan numérique
    Inscrit en
    Janvier 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisan numérique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 48
    Par défaut
    D'après ce que tu as fais Etanne, je crois que je n'ai pas compris le problème pareil.

    Il me semble qu'il veut un produit cartésien à n dimensions de sa liste.

    EDIT : Ou pas... (Je sais, je me contredis)

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

Discussions similaires

  1. Méthode récursive et yield
    Par jacky01 dans le forum C#
    Réponses: 6
    Dernier message: 12/01/2010, 15h42
  2. [JMX] Appel d'une méthode distante avec retour d'objet complexe
    Par hugo123 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 24/07/2009, 12h18
  3. Réponses: 14
    Dernier message: 06/06/2009, 21h42
  4. Rendre une liste visible avec Javascript
    Par will89 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 14/08/2008, 16h44
  5. [AJAX] Creer une méthode ajax avec un return
    Par Khrysby dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/04/2007, 19h01

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