2009-07-24 11 views
8

Jestem nowy dla leków generycznych. Chcę zaimplementować własną kolekcję, wyprowadzając ją z interfejsu IList<T>.Implementacja interfejsu IList

Czy możesz podać mi link do klasy implementującej interfejs IList<T> lub podać kod, który przynajmniej implementuje metody Add i Remove?

Odpowiedz

14

Jeśli nie masz do tego bardzo ważnego powodu, najlepiej będzie odziedziczyć po System.Collections.ObjectModel.Collection<T>, ponieważ ma wszystko, czego potrzebujesz.

Należy pamiętać, że chociaż implementatory IList<T> nie są wymagane do wdrożenia this[int] (indeksowania), aby uzyskać O (1) (zasadniczo, stały dostęp czasowy), zdecydowanie zaleca się to zrobić.

2

Możesz spojrzeć na Mono project. Dostępne są kompletne kody źródłowe, z których możesz dowiedzieć się, w jaki sposób są zaimplementowane niektóre klasy. Na przykład "System.Collections.Generics.List < T>".

+2

http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Collections.Generic/List.cs?view=markup – Stobor

+0

po otwarciu strony głównej projektu Mono .. co powinienem pobrać? –

+0

Zaktualizowany link do klasy Mono - https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/List.cs –

1

W większości przypadków można po prostu użyć List<T> lub wyprowadzić z List<T>. Jeśli pochodzisz z wersji List<T>, automatycznie otrzymasz implementację funkcji Dodaj i usuń.

24

Oprócz wywodzenia się z List<T>, możesz także elewacji List<T> i dodać więcej funkcji do klasy elewacji.

class MyCollection<T> : IList<T> 
{ 
    private readonly IList<T> _list = new List<T>(); 

    #region Implementation of IEnumerable 

    public IEnumerator<T> GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 

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

    #endregion 

    #region Implementation of ICollection<T> 

    public void Add(T item) 
    { 
     _list.Add(item); 
    } 

    public void Clear() 
    { 
     _list.Clear(); 
    } 

    public bool Contains(T item) 
    { 
     return _list.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     _list.CopyTo(array, arrayIndex); 
    } 

    public bool Remove(T item) 
    { 
     return _list.Remove(item); 
    } 

    public int Count 
    { 
     get { return _list.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return _list.IsReadOnly; } 
    } 

    #endregion 

    #region Implementation of IList<T> 

    public int IndexOf(T item) 
    { 
     return _list.IndexOf(item); 
    } 

    public void Insert(int index, T item) 
    { 
     _list.Insert(index, item); 
    } 

    public void RemoveAt(int index) 
    { 
     _list.RemoveAt(index); 
    } 

    public T this[int index] 
    { 
     get { return _list[index]; } 
     set { _list[index] = value; } 
    } 

    #endregion 

    #region Your Added Stuff 

    // Add new features to your collection. 

    #endregion 
} 
+0

Ale w tym przypadku nie mogę związać mojej kolekcji do DataGridView raczej muszę odsłonić członka _list w MyCollection. –

+0

Jakie są tego wady? –

+2

Przepraszam za spóźnioną odpowiedź, ale ta straciła mnie @ 'IEnumerator GetEnumerator' zwróciło' GetEnumerator'. To wygląda jak okólnik. W jaki sposób nie powoduje wyjątku przepełnienia stosu? – jp2code

0

Dziedziczenie z listy często najszybszy podejście, ale może być ograniczenie później w dół linii, jeśli trzeba dziedziczą z innej klasy (np ContextBoundObject itd.). Szybko wdrożyć IList i jak wspomniano powyżej, daje to o wiele większą elastyczność.

Powiązane problemy