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 :

Collection d'objets différents


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 254
    Points : 181
    Points
    181
    Par défaut Collection d'objets différents
    Bonjour,

    J'ai une question que j'arette pas de ma poser sans trouver de solution à chaque fois que je suis confronté au problème. Je vous l'expose via un exemple :

    Disons que j'ai une classe abstraite "compte" et plusieurs classes de spécialisation "compte courant" , "carnet de dépôt", "compte titres", ... A un moment donné, pour une raison quelconque j'ai une collection de comptes. Dans ma collection je peut aussi bien avoir des comptes courants, des carnets de dépôtset des comptes titres mélangés. Ca pourrais par exemple être la collection des comptes d'un client. Il possède 2 comptes courants, 2 carnets de dépôts et 1 compte titres. Le but est de réaliser une opération sur qu'un seul type de compte. Disons que je veux ajouter 100 EUR sur tout les comptes courants de mon client. Comment procéder facilement ? Quel type de collection me permet de faire ca ?

    Merci.

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Citation Envoyé par DranDane Voir le message
    Disons que je veux ajouter 100 EUR sur tout les comptes courants de mon client.
    Je présume que le champ qui correspond au solde du compte est présent dans la superclasse. Si ce n'est pas le cas tu peux placer le champ dans la classe abstraite et implémenter une propriété pour l'appeler.

    Tu peut utiliser une collection de type List<T> qui contient une méthode ForEach permettant de réaliser un traitement sur l'ensemble des objets de la collection. Par exemple (ici Solde étant la propriété représentant le solde du compte):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    List<Compte> comptes = new list<Compte>();
    comptes.ForEach(delegate(Compte comp) {comp.Solde += 100; });

  3. #3
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Je présume que le champ qui correspond au solde du compte est présent dans la superclasse. Si ce n'est pas le cas tu peux placer le champ dans la classe abstraite et implémenter une propriété pour l'appeler.

    Tu peut utiliser une collection de type List<T> qui contient une méthode ForEach permettant de réaliser un traitement sur l'ensemble des objets de la collection. Par exemple (ici Solde étant la propriété représentant le solde du compte):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    List<Compte> comptes = new list<Compte>();
    comptes.ForEach(delegate(Compte comp) {comp.Solde += 100; });
    Si tu fais ça, tu vas ajouter 100€ sur tous les comptes de la collection.

    Ce qu'on nous demande, c'est d'ajouter 100€, mais seulement sur les comptes courants.
    Il y a toujours au moins deux solutions à un problème.

    http://software-design-development.blogspot.com/

  4. #4
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Compte compte;
    CompteCourant comptecourant = compte as CompteCourant;
    comptecourant vaudra null si compte n'est pas du type CompteCourant.
    Tu n'as plus qu'à boucler sur tous les comptes de ta collection et ajouter 100€ lorsque comptecourant n'est pas null.
    Il y a toujours au moins deux solutions à un problème.

    http://software-design-development.blogspot.com/

  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
    En C#3, il existe une fonction d'extension "OfType" sur les IEnumerable. http://msdn.microsoft.com/fr-fr/library/bb360913.aspx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comptes.OfType<CompteCourant>().ForEach(c => c.Solde += 100);
    Ca, ca marche si tu distingues les différents type de compte en faisant une hiérarchie de classe.

    Sinon, si en fait tu as une classe unique "Compte" et que c'est selon de la valeur d'une propriété "TypeCompte" que tu distingues tes types de compte, tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comptes.Where(c => c.TypeCompte == TypeCompte.Courant).ForEach(c => c.Solde += 100);
    ಠ_ಠ

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 254
    Points : 181
    Points
    181
    Par défaut
    Merci pour toutes vos réponses rapides.

    Je crois que ce que je cherche est tout à fait cette fonction d'extension "OfType". J'ai toujours évité et détesté les collections génériques car ce truc manquais terriblement. Et bien voilà qui va me rabibocher avec eux Ce sera aussi une bonne raison pour moi de passer au framework 3.0.

  7. #7
    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
    C'est faisable en C#2 mais moins joli...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    comptes
      .FindAll(delegate(Compte c) { return (c is CompteCourant); })
      .ConvertAll<CompteCourant>(delegate(Compte c) {return (CompteCourant)c; })
      .ForEach(delegate(CompteCourant c) { c.Solde += 100; });
    // Autant faire ça :
    foreach(Compte c in comptes)
      if (c is CompteCourant)
        ((CompteCourant)c).Solde += 100;
    Et encore, le ConvertAll n'est nécessaire que si Solde est une propriété de CompteCourant mais pas de Compte.
    ಠ_ಠ

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Citation Envoyé par Gold Bug Voir le message
    Si tu fais ça, tu vas ajouter 100€ sur tous les comptes de la collection.

    Ce qu'on nous demande, c'est d'ajouter 100€, mais seulement sur les comptes courants.
    Bah j'ai mal lu...

    Par contre, Je connaissais pas la méthode OfType merci Guulh

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

Discussions similaires

  1. Problème de gestion d'une collection d'objet
    Par poolky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/02/2006, 21h51
  2. objets différents dans un même vector...
    Par Empty_body dans le forum Langage
    Réponses: 7
    Dernier message: 07/01/2006, 18h20
  3. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11
  4. Probléme collection d'objets
    Par Contrec dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 10h08
  5. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58

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