2009-07-24 28 views
8

Soy nuevo en genéricos. Quiero implementar mi propia colección derivándola de la interfaz IList<T>.Implementación de la interfaz IList

¿Puede proporcionarme algún enlace a una clase que implemente la interfaz IList<T> o proporcione un código que implemente al menos los métodos Add y Remove?

Respuesta

14

A menos que tenga una razón muy convincente para hacerlo, su mejor opción será heredar de System.Collections.ObjectModel.Collection<T> ya que tiene todo lo que necesita.

Tenga en cuenta que aunque los implementadores de IList<T> no están obligados a implementar this[int] (indexador) para ser O (1) (básicamente, acceso de tiempo constante), se recomienda encarecidamente que lo haga.

2

Puede consultar Mono project. Hay códigos fuente completos disponibles, puedes ver cómo se implementan algunas clases. Por ejemplo, "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

después de abrir la página de inicio del proyecto Mono ... qué ¿debería descargar? –

+0

Enlace actualizado a la clase Mono - https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/List.cs –

1

En la mayoría de los casos, simplemente puede usar List<T> o derivar de List<T>. Si deriva de List<T>, obtendrá automáticamente la implementación para Agregar y Eliminar.

24

Además de derivar de List<T>, puede fachada List<T> y agregar más características a su clase de fachada.

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

Pero en este caso no puedo enlazar mi colección Para DataGridView, en lugar de eso, debo exponer el miembro _list en MyCollection. –

+0

¿Cuáles son los inconvenientes de hacer esto? –

+2

Lo siento por la respuesta tardía, pero este me ha perdido @ 'IEnumerator GetEnumerator' devolviendo' GetEnumerator'. Esto parece una referencia circular. ¿Cómo esto no causa una excepción de desbordamiento de pila? – jp2code

0

Heredar de lista es a menudo el método más rápido, pero puede ser limitante más adelante en la línea si necesita heredar de otra clase (por ejemplo ContextBoundObject etc.). Es bastante rápido implementar IList y, como se señaló anteriormente, ofrece mucha más flexibilidad.

Cuestiones relacionadas