2017-03-14 1 views
0

Je ne pense pas que je comprends IEnumerable et ai fait plusieurs google search.C# IEnumerable implementation

Je suis censé faire un conteneur de certains objets, où la classe Container devrait gérer la mise à jour de la collection que le conteneur représente (ajouter, supprimer).

la collection Container doit être et l'instance de IEnumerable<element>.

namespace .... 
{ 
    public class Container : Ienumerable<Elements> 
    { 
     List<Elements> _elm = new List<Elements>(); 
     List<Elements> _add = new List<Elements>(); 
     List<Elements> _rem = new List<Elements>(); 

     public voic PendAdd(Element elm) 
     { 
      _add.Add(elm); 
     } 

     public voic Pendrem(Element elm) 
     { 
      _rem.remove(elm); 
     } 

     ... 

     public IEnumerator<Element> GetEnumerator() 
     { 
      return _elm.GetEnumerator(); 
     } 

    } 
} 

Mon problème est que IEnumerable<Elements> est un type abstrait et si je fais _elm ce type je ne peux pas gérer l'état du Container même si je fais

IEnumerable<Element> _elm = new List<Element>(); 

VS se plaint de l'erreur :

'Container' does not implement interface member 'IEnumerable.GetEnumerator()'. 'Container.GetEnumerator()' cannot implement 'IEnumerable.GetEnumerator()' because it does not have the matching return of 'IEnumerator'.

Je sais qu'il y a plusieurs réponses à propos de IEnumerable mais elles ne m'aident pas.

+1

Quelle est la différence entre 'Element' et' Elements'? Vous héritez 'IEnumerable ' mais déclarez le type de retour de 'GetEnumerator' comme' IEnumerator 'et vous manquez la méthode non générique' IEnumerator GetEnumerator() '. –

+1

Si vous utilisez le raccourci 'Implement Interface' dans Visual Studio, il créera les méthodes que vous devez implémenter. Selon la réponse de xanatos, cela inclut la méthode GetEnumerator manquante avec son type de retour correct. –

+0

Pourquoi héritez-vous de IEnumerable? Et pourquoi avez-vous trois listes différentes? Vous pouvez juste avoir une classe wrapper autour d'un IEnumerable (comme une liste) et avoir des méthodes qui ajoutent/suppriment de cette liste. –

Répondre

3

Il vous manque le IEnumerable.GetEnumerator(): IEnumerable<T> hérite de IEnumerable. Donc, dans votre classe, vous avez besoin de deux types distincts de retour avec deux types de retour distincts.

public class Container : IEnumerable<Element> 
{ 
    List<Element> _elm = new List<Element>(); 
    List<Element> _add = new List<Element>(); 
    List<Element> _rem = new List<Element>(); 

    public void PendAdd(Element elm) 
    { 
     _add.Add(elm); 
    } 

    public void Pendrem(Element elm) 
    { 
     _rem.Remove(elm); 
    } 

    public IEnumerator<Element> GetEnumerator() 
    { 
     return _elm.GetEnumerator(); 
    } 

    // This is called "explicit interface implementation", see 
    // https://msdn.microsoft.com/en-us/library/ms173157.aspx 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     // will call the "other" GetEnumerator() 
     return GetEnumerator(); 
    } 
} 

La prochaine fois que vous devez implémenter une interface, je vous suggère un clic droit sur l'interface dans Visual Studio et sélectionnez l'Implement Interface pour obtenir le squelette de toutes les méthodes dont vous avez besoin.