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

Windows Forms Discussion :

Récupérer un élément d'une Collection<t>


Sujet :

Windows Forms

  1. #1
    Invité
    Invité(e)
    Par défaut Récupérer un élément d'une Collection<t>
    Bonsoir,

    J'ai un petit soucis avec le code analysis de VS2008... Celui-ci préférant une utilisation de "Collection<T>" à la place de "List<T>", je tente donc d'essayer de le contenter.

    1. La classe "Cell" représentant une cellule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Cell
    {
       private string valueCell;
       private string width;
       private string height;
       ...
    }
    2. Une méthode me permettant de récupérer une cellule (sous-entendu un objet "Cell") depuis une liste de cellules à partir de son nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private List<Cell> cells;
    public Cell GetCell (string valueCell)
    {
       return (cells.find(delegate(Cell cell) {return cell.Value.Equals(valueCell);}
    }
    3. J'aimerais donc contenter l'analyseur de code en remplaçant la "List" par une "Collection". Cependant, la collection ne dispose pas de méthode permettant de récupérer un objet à partir de celle-ci. Ce que j'ai tenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private Collection<Cell> cells;
    public Cell GetCell (string valueCell)
    {
       int i = cells.IndexOf(delegate(Cell cell) {return cell.Value.Equals(valueCell);}
       return cells[i];
    }
    Mais là, j'ai droit à une erreur "Cannot convert anonymous method to type "Cell" because it is not a delegate type.

    Je patauge un peu... Une idée ?

    Merci d'avance

  2. #2
    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 749
    Points
    39 749
    Par défaut
    IndexOf ne fonctionne pas comme Find : ça prend en paramètre l'objet recherché, pas un delegate...

    Donc en gros tu ne peux pas faire la même chose qu'avec une List<T>, ce qui revient à dire que l'analyseur de code t'a dit de la m**** . Il ne faut pas trop se laisser influencer par ce genre d'outils à mon avis... il peut parfois faire des suggestions "intelligentes", mais au final c'est à toi de prendre la décision : si tu préfères utiliser une List<T>, utilise une List<T>... En l'occurence je me demande pourquoi il conseille d'utiliser Collection<T>

    Perso je te conseille plutôt de faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Cell GetCell (string valueCell)
    {
      var result = from c in cells
                   where c.Value == valueCell
                   select c;
      return result.FirstOrDefault();
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tomlev Voir le message
    IndexOf ne fonctionne pas comme Find : ça prend en paramètre l'objet recherché, pas un delegate...
    Effectivement, là est bien mon soucis

    Citation Envoyé par tomlev Voir le message
    Donc en gros tu ne peux pas faire la même chose qu'avec une List<T>, ce qui revient à dire que l'analyseur de code t'a dit de la m**** . Il ne faut pas trop se laisser influencer par ce genre d'outils à mon avis... il peut parfois faire des suggestions "intelligentes", mais au final c'est à toi de prendre la décision : si tu préfères utiliser une List<T>, utilise une List<T>... En l'occurence je me demande pourquoi il conseille d'utiliser Collection<T>

    Perso je te conseille plutôt de faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Cell GetCell (string valueCell)
    {
      var result = from c in cells
                   where c.Value == valueCell
                   select c;
      return result.FirstOrDefault();
    }
    Merci pour ton avis éclairé sur le sujet.

    De plus, je trouve ta manière plus claire "à lire" que mon utilisation de délégué, à retenir

  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
    Citation Envoyé par tomlev Voir le message
    En l'occurence je me demande pourquoi il conseille d'utiliser Collection<T>
    J'ai été confronté à cette règle il y a peu. L'explication que MSDN donne est la suivante

    System.Collections.Generic.List is a generic collection designed for performance not inheritance and, therefore, does not contain any virtual members. The following generic collections are designed for inheritance and should be exposed instead of System.Collections.Generic.List.
    ...mais bon, la différences n'est pas flagrante, vu que List<T> et Collection<T> implémentent exactement les mêmes interfaces
    Il y a toujours au moins deux solutions à un problème.

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

  5. #5
    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 749
    Points
    39 749
    Par défaut
    System.Collections.Generic.List is a generic collection designed for performance not inheritance and, therefore, does not contain any virtual members. The following generic collections are designed for inheritance and should be exposed instead of System.Collections.Generic.List.
    Bizarre... Si on s'en tient à cette explication, il me semble que List<T> est un meilleur choix (plus performant), à moins de vouloir faire une collection personnalisée en héritant d'une collection existante.

  6. #6
    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 que la MSDN dit, ce n'est n'est pas d'éviter les variables membres de type List<T> ; c'est d'éviter d'avoir des méthodes publiques qui prennent en paramètre ou renvoient des List<T>.

    C'est pas pareil
    ಠ_ಠ

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

Discussions similaires

  1. Récupérer un élément d'une combobox non sélectionnée
    Par skytofer31 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/12/2006, 15h50
  2. Récupérer les valeurs d'une collection de checkbox
    Par licorne dans le forum Langage
    Réponses: 4
    Dernier message: 27/10/2006, 13h53
  3. Comment récupèrer les éléments d'une JList
    Par Orian dans le forum Composants
    Réponses: 13
    Dernier message: 10/09/2006, 12h53
  4. Réponses: 5
    Dernier message: 22/02/2006, 18h32

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