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 :

Type d'objet contenu dans un arrayList [Débutant]


Sujet :

C#

  1. #1
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut Type d'objet contenu dans un arrayList
    Bonjour à tous
    Je pense que le titre est assez expressif.

    J'ai une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void traitement_des_lecture(ArrayList tab_lecture)
    foreach (Type_tab_lecture _my_enreg in tab_lecture)
    {
    ...
    }
    Si les traitements sont les mêmes, les arrayList ne le sont pas.
    Comment je peux dynamiser le Type_tab_lecture de mon foreach.

  2. #2
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Ok j'ai trouvé ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tab_lecture[0].GetType()
    c'est pas super propre vu que je pense que je serai obligé de gérer les arraylist null mais bon.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Ta question n'est pas très claire... Qu'est-ce que tu cherches à faire exactement ?

    Soit dit en passant, à moins que tu n'utilises encore .NET 1.x, il vaut mieux éviter d'utiliser ArrayList. Il vaut mieux utiliser les collections génériques comme List<T> (List<Type_tab_lecture> dans ton cas)

  4. #4
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Disons que dans mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private void traitement_des_lecture(ArrayList tab_lecture)
    Je peux envoyer des arrayList de différents Objets.

    Donc pour mes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach (Type_tab_lecture _my_enreg in tab_lecture)
    {
    ...
    }
    Pourrai se transformer dynamiquement en
    foreach (Type_Voiture _my_enreg in tab_lecture)
    {
    ...
    }
    ou

    foreach (Type_Maison _my_enreg in tab_lecture)
    {
    ...
    }


    Mais tu m'as dis quelque chose de plus intéressant.
    Soit dit en passant, à moins que tu n'utilises encore .NET 1.x, il vaut mieux éviter d'utiliser ArrayList. Il vaut mieux utiliser les collections génériques comme List<T> (List<Type_tab_lecture> dans ton cas)
    Pourquoi ? (Je suis au 3.5)

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 180
    Points : 4 496
    Points
    4 496
    Par défaut
    parce que tu peux spécialiser les List<T>
    et donc ca empeche de faire des erreurs mettre des Voitures dans une liste de personne par exemple

    Avec une List<Voiture> tu es sur d'avoir que des voitures de plus tu évites de devoir caster

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listVoiture[0].Moteur;
    (Voiture)arrayList[0].Moteur;
    Pour plus d'info ici (note)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par rockley Voir le message
    Mais tu m'as dis quelque chose de plus intéressant.


    Pourquoi ? (Je suis au 3.5)
    Parce que c'est fortement typé ; au lieu d'une liste de object qui peuvent être n'importe quoi, tu as une liste de T (T étant un type précisé dans la déclaration). Donc plus besoin de faire des cast, pas de risque d'ajouter à la liste un objet d'un type incorrect, etc.

    En plus ça résout ton problème, en rendant la méthode générique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void traitement_des_lecture<T>(IList<T> tab_lecture)
    {
        foreach (T _my_enreg in tab_lecture)
        {
            ...
        }
    }
    Ca s'utilise comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<Type_tab_lecture> list = new List<Type_tab_lecture>();
    list.Add(...);
     
    ...
     
    traitement_des_lecture<T>(list);
    // ou même, en profitant de l'inférence de type générique :
    // traitement_des_lecture(list);

  7. #7
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Je suis désolé mais je ne vois pas la différence.

    En gros je lis plusieurs table oracle.
    Pour chaque table, j'ai une classe.

    par exemple pour voiture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Classe Voiture
    {
    String Mark;
    String Prix;
    String Couleur;
       public Voiture(OracleDataReader dr){
           _Mark = dr["Mark"].ToString();
           _Prix =  dr["Prix"].ToString();
           _Couleur = dr["Couleur"].ToString();
       }
       + les getters
    }

    Pour crée mon arrayList de Voiture je lance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                while (dr.Read())
                {
                    res.Add(new Voiture(dr));
                }
    Je vois pas comment je peux me retrouver avec d'autres objets dans mon arrayList que des voitures.

    Je n'ai peu être pas été claire sur ce que je voulais, dsl.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 180
    Points : 4 496
    Points
    4 496
    Par défaut
    mais rien n'empeche à faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     res.Add(new Maison(dr));
    or si tu utilise une List<Voiture> tu ne pourra pas le faire

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par rockley Voir le message
    Je vois pas comment je peux me retrouver avec d'autres objets dans mon arrayList que des voitures.
    Bah avec une ArrayList, tu pourrais le faire par erreur, sans réaliser que c'est une liste qui ne devrait contenir que des voitures. Dans ce cas précis tu as effectivement peu de chances de te planter, mais dans certains cas c'est moins évident. Alors qu'avec une liste générique, le compilateur détectera l'erreur...

    Autres avantages :
    - comme mentionné précédemment, tu n'as plus besoin de faire de cast des éléments de la liste vers le type réel de l'objet (avec encore une fois le risque que ça plante si l'objet n'est pas du type attendu).
    - en voyant le type de la variable liste, tu sais tout de suite ce qu'elle est supposée contenir, même si le nom n'est pas clair
    - avantage aussi en termes de performance, pour les types valeurs (int, DateTime, structures, enums, etc) : il n'y a plus de boxing (mécanisme qui consiste à encapsuler un type valeur dans une instance d'object, et qui peut être assez couteux en ressource)

    Bref, d'une manière générale, tu as toujours intérêt à préférer le typage fort, pour des raisons de clarté du code, de fiabilité et de performance. Les génériques sont souvent le moyen le plus simple de profiter du typage fort.

  10. #10
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Merci pour votre aide et pour vos explications.

    Je pense que je ferais des tests pour savoir quelle est la solution la plus rapide et que je choisirai en conséquence.

  11. #11
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    D'après ce que j'ai compris, rockley utilise justement des listes hétérogènes. Donc avoir une liste qui contient des voitures, des maisons et des personnes ne le gêne pas.

    Mais Si comme tu le dis, tu récupères en fait un certains type, venant d'une requête sur ton SGBD, alors oui, tu devrais retourner des listes de type unique donc List<T> Ta requête "Select * from personne...." te retourneras des personnes donc ArrayList n'as pas de raison d'être List<Personne> est plus propre et évite le panier de crabes.

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

Discussions similaires

  1. Type des objets contenu dans un datatable
    Par lasrevinu dans le forum C#
    Réponses: 4
    Dernier message: 20/05/2010, 12h47
  2. Réponses: 6
    Dernier message: 14/11/2007, 15h51
  3. Element contenu dans une ArrayList
    Par F0ussa dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 10/05/2007, 17h10
  4. [jTree]Recupérer l'objet contenu dans la feuille
    Par nesbla dans le forum Composants
    Réponses: 1
    Dernier message: 27/11/2006, 15h03
  5. Réponses: 4
    Dernier message: 20/07/2006, 10h35

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