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 :

(IEnumerable || IEnumerable<T> || object[] )to List<Object>


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut (IEnumerable || IEnumerable<T> || object[] )to List<Object>
    Voilà tout est dit dans le titre, je cherche un moyen de récupérer une collection des objets contenus dans une ArrayList, List<Machin>, etc...

    J'ai implémenté des méthodes pour chaqu'un des Types de collection mais j'aime pas ça le statique et je suis persuadé que quelque chose de plus optimisé existe...

    Si jamais quelqu'un à la réponse je le remercie d'avance pour son aide!

  2. #2
    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
    Citation Envoyé par GSXRider Voir le message
    Voilà tout est dit dans le titre, je cherche un moyen de récupérer une collection des objets contenus dans une ArrayList, List<Machin>, etc...

    J'ai implémenté des méthodes pour chaqu'un des Types de collection mais j'aime pas ça le statique et je suis persuadé que quelque chose de plus optimisé existe...

    Si jamais quelqu'un à la réponse je le remercie d'avance pour son aide!
    Que veux tu faire ? Convertir ? Utiliser ? Si tu as une fonction qui se contente de faire un foreach sur un de ses paramètres, il suffit que ce paramètre soit de type IEnumerable (ou IEnumerable<T>, c'est selon) et aucune conversion n'est nécessaire.

    Mais ce que tu dis est pas clair, tu peux être plus explicite ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    D'apres ce que j'ai compris du titre, tu veux passer d'un IEnumerable<T> (array ou autre) à une List<T> ? Si tel est le cas, il existe une surcharge du ctor de List qui prend un IEnumerable en parametre.

    Sinon, sois plus clair. =)

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    En fait c'est pas très compliqué j'ai fait un parseur Object <> XML
    Mon problème est de créer une méthode de parsing commune aux collections HashTable, ArrayList, List<List<>> Etc... pour lire et ecrire.
    Niveau reflexion aucun prob mais là je cherche à faire qu'une seule méthode générique de Lecture/Ecriture d'une instance IEnumerable ou IEnumerable<T> pour les tableaux d'objets..

  5. #5
    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
    Toujours pas compris. Le fait que ta méthode prenne un IEnumerable<T> en paramètre ne suffit pas ?

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    bon c'était pas compliqué pour la lecture
    IEnumerable enumeration = (IEnumerable)obj;
    IEnumerator enumerator = enumeration.GetEnumerator();
    object o = enumerator.Current;
    if (o != null)
    collobj.Add(o);
    while(enumerator.MoveNext())
    collobj.Add(enumerator.Current);

    Me reste à tester pour les types IsArray (object[])

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Toujours pas compris. Le fait que ta méthode prenne un IEnumerable<T> en paramètre ne suffit pas ?

    Reflexion

  8. #8
    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
    Un bon petit foreach me paraît nettement plus simple et maintenable qu'un gestion manuelle de l'itérateur...
    Sachant qu'en plus, IEnumerable<T> aussi bien que T[] héritent de IEnumerable, il te suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<object> f(IEnumerable source)
    {
        List<object> result = new List<object>();
        foreach(object item in source)
            result.Add(item);
        return result;
    }
    Et tu peux appeler f sur une collection, une liste, les valeurs d'un dico, un array, ...

    Et quel est le rapport avec la réflexion ?

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    Oui pour la reflexion rien à voir

  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
    Citation Envoyé par GSXRider Voir le message
    Oui pour la reflexion rien à voir
    Alors résolu ?

  11. #11
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    Non je n'arrive tjrs pas à instancier une List<List<MACHIN>>
    Je n'ai trouvé qu'en renvoyant des IEnumerables.

    Et lorsque je retourne une IEnumerable qui imbrique des IEnumerable dans l'Invoke de mon Set j'ai une erreur.. Logique mais pas de solution, je continue de chercher...

  12. #12
    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
    Un ch'tit coup de récursivité ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    List<object> f(IEnumerable source)
    {
        List<object> result = new List<object>();
        foreach(object item in source)
           if (item is IEnumerable)
               result.AddRange(f(item as IEnumerable));
           else
               result.add(item);
        return result;
    }
    Faut rajouter quelques contrôles (de non nullité notamment) et s'abstenir de l'utiliser avec des List qui se contiennent les unes les autres histoire d'éviter les boucles infinies.

  13. #13
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    Merci bcp ça ça marche!
    Maintenant mon prob c l'inverse lol

    Lorsque je recaste dans le bon Type des List<List<MACHIN>>
    ça marche pour une profondeur de 1 car il me fait ça
    object o = Activator(TYPE LIST<Machin>) (avec les args et tout ...)
    o = (IEnumerable) maListeObjetRecup;

    mais le soucil c lorsque maListeObjetRecup c'est des List<Machin>
    là j'ai forcément un truc qui est convertit en List<List<objet>> et ça il aime pas il fait des catchs et du coup moi aussi ça me donne envie de faire des catch avec mon écran!!
    Quelqu'un sauvera t'il mon écran??

    raaaahhh

  14. #14
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    Bon en fait je viens de réfléchir un petit peu (j'ai été obligé là).. surment qu'en utilisant le générique IEnumerable<MonType> plutot qu'un cast en (IEnumerable) ça devrai marcher... mais pas sur, je test je tiens informé..

  15. #15
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    Bon j'ai pas mal cherché mais apparament instancier un IEnumerable<T> ou créer une classe générique intermédiaire n'apporte pas grand chose...

    Je me retrouve avec une List<object> Typés comme il le faut a passer sur un object o dont le type doit être absolument respecté (Exit les o = (IEnumerable)maLst

    J'ai essayé une feinte avec les pointeurs :
    IEnumerable e1 = (IEnumerable)maLst;
    IEnumerable e2 = (IEnumerable)o;
    e2 = e1;
    mais rien...
    Je me suis rabatut sur la méthode Add en passant par une classe générique que j'ai créé avec un GetObjet() qui me retourne un objet de mon type
    Je fait des foreach imbriqués sur les props et j'invoke la methode "Add" commune à ~ tout les types de collection.
    se qui m'embete c'est que cette méthode ne fait parti d'aucune interface..

    Bref ça me plai pas comme bidouille alors si quelqu'un connais une solution pour affecter un IEnumerator à un objet IEnumerable ça m'intéresse!

Discussions similaires

  1. ClassCastException: [Ljava.lang.Object et Liste
    Par lepetitjoe dans le forum Langage
    Réponses: 14
    Dernier message: 26/06/2008, 18h29
  2. [c#] IEnumerable - IEnumerator
    Par lapanne dans le forum C#
    Réponses: 2
    Dernier message: 31/01/2008, 11h01
  3. Peut faire un Dispose d'une List(Of object) ?
    Par MadLion dans le forum VB.NET
    Réponses: 6
    Dernier message: 19/11/2007, 11h15
  4. List ordre object
    Par drKzs dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 14/09/2006, 17h43
  5. caster une List<Object> en List<..>
    Par K-Kaï dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2006, 17h43

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