2009-12-12 11 views
9

Ho una classe, che è solo un involucro su un elenco, cioè,Implementare IEnumerable <T> Per un elenco Wrapper

public class Wrapper 
{ 
    public List<int> TList 
    {get;set;} 
    public Wrapper() 
    { 
     TList=new List<int>(); 
    } 
} 

Voglio fare Wrapper eredita da IEnumerable in modo che possa utilizzare la seguente sintassi:

Wrapper wrapper = new Wrapper() 
         { 
         2,4,3,6 
         }; 

Qualsiasi idea di come l'interfaccia da implementare IEnumerable<T>, o IEnumerable, e come definire il corpo del metodo?

+0

No, con IEnumerable non funzionerà. Penso che tu debba implementare ICollection . – deerchao

+3

No, per il deerchao, ha bisogno di IEnumerable . Non * richiediamo * ICollection , sebbene, ovviamente, sia ragionevole farlo. –

risposta

32

Se si implementa ICollection<int> si ottiene la funzionalità desiderata.

Correzione: in realtà solo bisogno di implementare IEnumerable o IEnumerable<T> e hanno un Add metodo pubblico nella classe:

public class Wrapper : IEnumerable<int> 
{ 
    public List<int> TList 
    { get; private set; } 
    public Wrapper() 
    { 
     TList = new List<int>(); 
    } 

    public void Add(int item) 
    { 
     TList.Add(item); 
    } 
    public IEnumerator<int> GetEnumerator() 
    { 
     return TList.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

(ho anche preso la libertà di fare il TList setter privato; di solito è consigliabile che le proprietà del tipo di raccolta sono di sola lettura in modo che la raccolta non possa essere sostituita da alcun codice esterno al tipo.)

+0

Dannazione, mi hai battuto :) – ICR

+0

Perché abbiamo bisogno di implementare sia una versione generica che una non generica di GetEnumerator? – hdgarrood

+0

@hdgarrood Ciò è necessario perché 'IEnumerable ' eredita 'IEnumerable' che non è generico. Un tipo che implementa 'IEnumerable ' implementa anche 'IEnumerable', quindi anche quei metodi devono essere presenti. –

9

Per ottenere gli inizializzatori di raccolta è necessario eseguire 2 operazioni:

  1. Implementare IEnumerable
  2. avere un metodo chiamato Aggiungere con la firma corretta

Il modo preferibile per ottenere questi è quello di attuare ICollection, ma il minimo che dovete fare è:

public class Wrapper : IEnumerable<int> 
{ 
    public List<int> TList 
    {get;set;} 

    public IEnumerator<int> GetEnumerator() 
    { 
     return TList.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() // Explicitly implement the non-generic version. 
    { 
     return TList.GetEnumerator(); 
    } 

    public void Add(int i) 
    { 
     TList.Add(i); 
    } 

    public Wrapper() 
    { 
     TList=new List<int>(); 
    } 
} 
Problemi correlati