2009-12-12 10 views
9

tengo una clase, que es sólo un envoltorio más de una lista, es decir,Implementar IEnumerable <T> Para obtener una lista Envoltura

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

Quiero hacer Wrapper hereda de IEnumerable para que pueda utilizar la siguiente sintaxis:

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

alguna idea de cómo implementar la interfaz que debe IEnumerable<T> o IEnumerable, y cómo definir el cuerpo del método?

+0

No, con IEnumerable no funcionará. Creo que debes implementar ICollection . – deerchao

+3

No, deerchao, necesita IEnumerable . No * requerimos * ICollection , aunque, por supuesto, es sensato hacerlo. –

Respuesta

32

Si implementa ICollection<int>, obtendrá la funcionalidad deseada.

Corrección: en realidad sólo es necesario aplicar IEnumerable o IEnumerable<T> y tienen un método público Add en su clase:

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(); 
    } 
} 

(también tomé la libertad de hacer el TList setter privado; por lo general se recomienda que las propiedades de tipo de colección son de solo lectura, de modo que la colección como tal no puede ser sustituida por ningún código fuera del tipo.)

+0

Maldita sea, me ganaste :) – ICR

+0

¿Por qué tenemos que implementar una versión genérica y no genérica de GetEnumerator? – hdgarrood

+0

@hdgarrood Esto es necesario porque 'IEnumerable ' hereda 'IEnumerable' que no es genérico. Un tipo que implementa 'IEnumerable ' también implementa 'IEnumerable', por lo que esos métodos deben estar presentes también. –

9

Para obtener inicializadores de recopilación, debe hacer 2 cosas:

  1. Implementar IEnumerable
  2. tienen un método llamado Añadir a la firma correcta

La forma preferible conseguir éstos es poner en práctica ICollection, pero el mínimo que hay que hacer es:

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>(); 
    } 
} 
Cuestiones relacionadas