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 :

passage en IEnumerable


Sujet :

C#

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut passage en IEnumerable
    Bonjour à tous,

    j'ai un gros soucis, avec IEnumerable.

    J'ai repris un soft, qui utilise IEnumerable<T> tout le long du traitement.

    Hors, je dois effectuer un changement de donnée.

    je fais un foreach sur mon IEnumerable<T>, et j'ajoute chacun des éléments (après modif) dans une iList.

    Petit problème, j'aurais besoin pour continuer mon programme, de traiter mon iList en IEnumerable<T>.

    Comment faire ?

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Tu pourrais utiliser un List<T> pour ajouter chacun des éléments (après modif) et faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            taListModif.AsEnumerable<T>();
    où taListModif est ta List<T>

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette réponse rapide, mais je ne trouve pas de asenumerable pour ma liste.

    Voici le code, pôur plus d'explication :

    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
    XmlSerializer xSer = new XmlSerializer(typeof(T[]));
    
                    IEnumerable<CDefDiscretSauvegarde> ilist2 = (IEnumerable<CDefDiscretSauvegarde>)xSer.Deserialize(reader);
                    bool discret_find = false;       // flag d'identification du discret reçu
    
                    ArrayList ilist3 = new ArrayList();
                    IList<CDefDiscret> liste_dico = new List<CDefDiscret>(CMain.Instance.DicoDiscrets); // liste des discrets de référence
                    foreach (CDefDiscretSauvegarde cDefDiscret in ilist2)
                    {
                        int numTiroir = cDefDiscret.NumTiroir;
                        int numcarte = cDefDiscret.NumCarte;
                        int numVoie = cDefDiscret.NumVoie;
                        CDefDiscret discretTmp = new CDefDiscret();
                        for (int j = 0; j < liste_dico.Count; j++)
                        {
                            CDefDiscret d = (CDefDiscret)liste_dico[j];
                            if ((d.NumTiroir == numTiroir) && (d.NumCarte == numcarte) && (d.NumVoie == numVoie))
                            {
                                discretTmp = d.Clone() as CDefDiscret; // new CDefDiscret(d);
                                discretTmp.Pilotage = cDefDiscret.Pilotage;
                                discretTmp.Surveillance = cDefDiscret.Surveillance;
                                discretTmp.MoyenSurveillance.LedAffichage.NumLed = cDefDiscret.NumLed;
                                discretTmp.MoyenSurveillance.LedAffichage.CouleurEtatVRAI = cDefDiscret.CouleurEtatVRAI;
                                discretTmp.MoyenSurveillance.LedAffichage.CouleurEtatFAUX = cDefDiscret.CouleurEtatFAUX;
                                discretTmp.MoyenSurveillance.LedAffichage.Utilisee = cDefDiscret.Utilisee;
                                discretTmp.MoyenSurveillance.ModeSurveillance = cDefDiscret.ModeSurveillance;
                                discretTmp.DashInPort = cDefDiscret.DashInPort;
                                discret_find = true;
                                ilist3.Add(discretTmp);
                            }
                        }
                        if (!discret_find)
                            MessageBox.Show(_gestionLangue.LireTexte(CGestionLangue.ESection.information.ToString(), "no_discret", "") + string.Format(" {0:00} / {1:00} / {2:00}", numTiroir, numcarte, numVoie));
                    }
                    IEnumerable<T> iIist = (IEnumerable<T>)ilist3; // exception error
                   
                    // Fusionner la liste courante et les nouveaux éléments
                    this.MergeWith(iIist, isClearBefore);
    Le but est d'arriver à passer mon ilist3 en IEnumerable pour passer dans la méthode : "this.mergeWith"

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList ilist3 = new ArrayList();
    moi je te proposais d'utiliser un List<T> et pas un ArrayList. Ca devrait marcher pareil dans ton code ( add est dispo)

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut Ilist<T>
    ok
    Maintenant, j'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    //ArrayList ilist3 = new ArrayList();
                    List<T> ilist3 = new List<T>();
    Mais la méthode AsEnumerable() n'est toujours pas présente pour ilist3...

    Même l'aide de .net ne la connait pas... quid ?

  6. #6
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut as enumerable
    après recherche, il s'agit d'une méthode du framework 3.0 Hors j'utilise le 2.0

    Une autre solution ?

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Pardon, je suis avec le framework 3.0 (que tu ne doit pas avoir)...

    Dsl. Mais si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IEnumerable<T> iIist = ilist3;
    Ca ne fonctionne pas ?

  8. #8
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut cast ?
    ha oui ! ça ça marche nikel, seul soucis... je n'arrive pas à caster mon discret_tmp en <T>...

    On y est presque !

  9. #9
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    je viens enfin de comprendre ton premier post.

    en fait je pense qu'on a fait fausse route, en effet, je dois obligatoirement utiliser le type Cdefdiscret pour discretTmp, donc je ne vois pas comment ajouter du CdefDiscret, dans une liste de type <T>.

  10. #10
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut rien d'autre ?
    Bon apparement, pas de solution... Merci en tout cas à binoo d'avoir tenté de m'aider... Personne d'autre ?

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Tu veux dire que IEnumerable<Cdefdiscret> est obligatoirement ton type de sortie en fait ?

  12. #12
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    je dirais plutot obligatroirement, de type Ilist<CdefDiscret>

    Si tu regarde bien mon Foreach, tu te rends compte qu'on des propriétés qui lui osnt attribuée. Ces propriétés sont définies par la classe cDefDiscret.

    Après, on peut faire ce que tu veux, mais je veux veut avoir dans mon iList3 des données de structurée du type "CdefDiscret".

    ça me parait super simple, et pourtant impossible de trouver la solution

  13. #13
    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
    Ce n'est pas très clair dans ce que tu as écrit : tu as bien remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList ilist3 = new ArrayList();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<CDefDiscret> ilist3 = new List<CDefDiscret>();
    ?
    ಠ_ಠ

  14. #14
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    oui, du coup, je ne peux pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IEnumerable<T> iIist = ilist3;
    Il me dit qu'il ne peut pas convertir directement.

    J'ai remarqué aussi que lorsque je passe masouris sur T, il me marque qu'il est du type "CdefDiscretSauvegarde", c'est à dire, du type que j'extrait de mon xml via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IEnumerable<CDefDiscretSauvegarde> ilist2 = (IEnumerable<CDefDiscretSauvegarde>)
    Je ne comprend absolument rien à ces IEnumerable et aux <T>

  15. #15
    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
    Si j'ai bien tout compris : le bout de code que tu nous a montré se trouve lui même dans une fonction ou dans une classe générique, dont le type générique est T.

    Le contenu du code que tu a montré, par contre, ne fait appel à aucun fonction générique, qui a besoin d'un T en paramètre. Sauf dans la première ligne, XmlSerializer xSer = new XmlSerializer(typeof(T[]));

    Donc, question : quel est le type des paramètres de la fonction this.MergeWith ? Est-ce une fonction générique ?
    ಠ_ಠ

  16. #16
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    oui c'est exact... et je m'embrouille, avant d'appeler ma fonction que j'ai écrit ici, j'ai trouvé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CSortingBindingList<CDefDiscretSauvegarde> u = new CSortingBindingList<CDefDiscretSauvegarde>();
    et apparement, c'est lui qui détermine mon <T>

    Le problème c'est que je me sert de <T> avant et après ma modif... hors après ma modif, on traite des cdefDiscret, alors qu'avant (XMLdeserialiser) on traite des cdefDiscretSauvegarde... comment changer le type de <T> ?

    (je t'avoue que je parle à moitié chinois là)

  17. #17
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut on change de stratégie
    En fait, je pense pouvoir me débrouiller, mais il me faudrait pourvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    //XmlSerializer xSer = new XmlSerializer(typeof(CDefDiscretSauvegarde));
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlSerializer xSer = new XmlSerializer(typeof(T[]));
    Mais apparement, il lui faut à tout pris un type T[] le problème a l'air insolvable si je garde ma structure de programme.

  18. #18
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut RESOLU !
    Bon en fet, j'ai effectué ma fonction mergewith() après une nouvelle instance de T, ainsi je fait toutes mes opération en T typé CdefDiscretSauvegarde, puis mes opération après transformation en T typé CdefDiscret. Merci à Guulh et Binoo de m'avoir aidé. Mais en fait ma question était complètement hors sujet par rapport à mon problème. Je m'excuse pour le temps perdu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                    CSortingBindingList<CDefDiscret> t = this.TravailSource;
                    CSortingBindingList<CDefDiscretSauvegarde> u = new CSortingBindingList<CDefDiscretSauvegarde>();
                    t.VerifyDiscretEvent += new VerifyDiscretEventHandler(TravailSource_VerifyDiscretEvent_Open);
                    u.CheckValidation += new _CheckFailedCurrentValidation(CheckValidationList);
     
                    List<CDefDiscret> discrets_travail = u.DeSerialize(ouverture.FileName, true);
                    t.MergeWith(discrets_travail, true);

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Pb BDE suite a passage en Windows 2000 pro
    Par ARIF dans le forum Paradox
    Réponses: 4
    Dernier message: 18/11/2002, 11h39
  3. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 10h15
  4. [VB6]Passage par référence d'une prop. d'objet à une fct
    Par -gYs- dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 02/09/2002, 08h55
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

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