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 :

question sur les generics


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 101
    Points : 68
    Points
    68
    Par défaut question sur les generics
    Bonjour à tous,
    j'aimerai comprendre la portée de l'utilisation d'un "IEnumerable" plutôt qu'une liste banale "list".
    Qu'est ce que ça entraîne d’utiliser l'un ou l'autre.

    Merci de m'aider

  2. #2
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,
    List implémente IList qui implémente IEnumerable. Donc IEnumerable est plus abstrait ; IList expose des membres souvent utiles, comme Count, ou encore l'accès par indexeur (maList[index]).
    Après ça dépend de ce que tu fais. Si tu as beaucoup de méthodes qui renvoient des collections en utilisant 'yield', tu vas préférer IEnumerable comme type de retour pour ne pas avoir à faire '.ToList()'. Si tu es constamment en train de tester le nombre d'éléments dans tes collections, tu vas préférer retourner des List. Après ça dépend aussi si tu utilises Linq...

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    l'utilisation n'est pas la même, sur IEnumarable tu ne peux pas faire .add

    et il me semble qu'un IEnumerable n'exécute pas immédiatement ce qu'on lui dit de faire via du linq, mais seulement lors de la lecture
    ce qui permettrait de faire des filtres multiples sans perte de performances (.where de linq etc...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    l'utilisation n'est pas la même, sur IEnumarable tu ne peux pas faire .add
    Tout à fait !

    Citation Envoyé par Pol63 Voir le message
    et il me semble qu'un IEnumerable n'exécute pas immédiatement ce qu'on lui dit de faire via du linq, mais seulement lors de la lecture
    ce qui permettrait de faire des filtres multiples sans perte de performances (.where de linq etc...)
    Ca en fait ça dépend du type de la collection concernée, IEnumerable étant une interface. Mais c'est vrai que ce tu dis est une utilisation fréquente de IEnumerable, d'où mon évocation de 'yield'.

    En fait pour résumer on peut dire que comme son nom l'indique, IEnumerable définit les membres permettant d'énumérer une collection, pas de la manipuler (ni Add, ni Remove, etc). Avec Linq la plupart du temps on peut se contenter de signatures de méthodes retournant des IEnumerable, les extensions Linq prenant cette interface comme paramètre 'this'. Mais quand on stocke une collection dans un champ local, souvent on a besoin d'y ajouter/retirer des éléments, donc là on va déclarer directement avec le type sous-jacent, List ou autre, pour ne pas avoir à caster tout le temps.

    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
     
    abstract class ClassDeBase<T>
    {
       public abstract IEnumerable<T> Collection
       {
            get;
        }
    }
     
    class EnProduction<T> : ClassDeBase<T>
    {
        private List<T> _data;
     
       ... ...
     
        public override IEnumerable<T> Collection
        {
            get { return this._data; }
        }
    }
     
    class Test<T> : ClassDeBase<T> where T : new()
    {
        public override IEnumerable<T> Collection
        {
            get 
            { 
                for(var i =0; i < 10; i++)
                {
                     yield return new T();
                }
            }
        }
    }

  5. #5
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 101
    Points : 68
    Points
    68
    Par défaut
    thx merci de votre aide

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

Discussions similaires

  1. Question sur les generics
    Par miya dans le forum Langage
    Réponses: 2
    Dernier message: 24/09/2014, 17h34
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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