2009-12-12 10 views
9

Mam klasy, która jest po prostu otoki na liście, to znaczy,Wdrożenie IEnumerable <T> dla listy Wrapper

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

Chcę, aby Wrapper dziedziczy z IEnumerable tak, że mogę użyć następującej składni:

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

Każdy pomysł jak zaimplementować interfejs który IEnumerable<T> lub IEnumerable oraz jak zdefiniować ciało metoda?

+0

Nie, z IEnumerable nie będzie działać. Myślę, że musisz wdrożyć ICollection . – deerchao

+3

Nie, deerchao, potrzebuje IEnumerable . Nie * wymagamy * ICollection , choć oczywiście rozsądnie jest to robić. –

Odpowiedz

32

Po wdrożeniu ICollection<int> otrzymasz żądaną funkcjonalność.

Korekta: faktycznie wystarczy wdrożyć IEnumerable lub IEnumerable<T> i mają publiczne Add metodę w swojej klasie:

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

(Wziąłem również wolność podejmowania TList seter prywatnego; zaleca się zwykle, że właściwości typu kolekcji są tylko do odczytu, więc kolekcja jako taka nie może zostać zastąpiona żadnym kodem poza typem.)

+0

Cholera, pobiłeś mnie do tego :) – ICR

+0

Dlaczego musimy wdrożyć zarówno ogólną, jak i nietypową wersję GetEnumerator? – hdgarrood

+0

@hdgarrood Jest to konieczne, ponieważ 'IEnumerable ' dziedziczy 'IEnumerable', która nie jest generyczna. Typ implementujący 'IEnumerable ' również implementuje 'IEnumerable', więc te metody również muszą być obecne. –

9

Aby uzyskać inicjatory kolekcji, należy wykonać 2 czynności:

  1. Wdrożenie IEnumerable
  2. mieć metodę o nazwie Dodaj z prawidłowym podpisem

Korzystny sposób, aby uzyskać te jest wdrożenie kolekcji ICollection, ale minimalna, co musisz zrobić to:

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>(); 
    } 
} 
Powiązane problemy