2010-05-21 26 views
8

Sé que, técnicamente, una interfaz se utiliza para leer y no escribir o editar, sin embargo, quiero agregar una función agregar y agregar rango a la siguiente clase, esto es lo que tengo actualmente que no funcionaColección personalizada Implementación IEnumerable

public class HrefCollection : IEnumerable<Href> 
{ 
    private IEnumerable<Href> hrefs; 

    public IEnumerable<Href> Add(Href href) 
    { 
     yield return href; 
    } 

    public IEnumerable<Href> AddRange(List<Href> hrefs) 
    { 
     foreach(Href href in hrefs) 
     { 
      yield return href; 
     } 
    } 

    public IEnumerator<Href> GetEnumerator() 
    { 
     return hrefs.GetEnumerator(); 
    } 

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

No estoy muy seguro de cómo asociar el rendimiento con la lista privada.

Gracias por su ayuda!

+1

Usted puede ser un poco confundido aquí. ¿Hay alguna razón para que no use simplemente una lista ? –

+1

"una interfaz se usa para leer y no para escribir o editar" ?? No entiendo esa declaración. ¿Te refieres a IEnumerable? – brickner

+0

Algo mal explicado, me refiero a que la interfaz Ienumerable no contiene un método de "agregar" porque se usa para devolver objetos de la colección actual, no para agregar o quitar algo de ella. –

Respuesta

4

Los IEnumerable<T> y IEnumerable interfaces se utilizan para generar una secuencia de sólo lectura o proporcionar una vista de sólo lectura de los elementos de una colección.

Si desea poder agregar elementos a su colección, internamente, deberá usar una estructura de datos que permita agregar elementos; por ejemplo, List<T>. Simplemente no puede agregar elementos utilizando las interfaces IEnumerable<T> o IEnumerable.

public class HrefCollection : IEnumerable<Href> 
{ 
    private readonly List<Href> _hrefs = new List<Href>(); 

    public void Add(Href href) 
    { 
     _hrefs.Add(href); 
    } 

    public void AddRange(IEnumerable<Href> hrefs) 
    { 
     _hrefs.AddRange(hrefs); 
    } 

    public IEnumerator<Href> GetEnumerator() 
    { 
     return _hrefs.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return ((IEnumerable)_hrefs).GetEnumerator(); 
    } 
} 
+0

Esto funciona, pero sigue siendo bastante tonto y no sirve para aprender cómo funciona el rendimiento. –

+0

@tehMick: Es cierto, pero la pregunta dice "Quiero agregar una función de agregar y agregar rango a la siguiente clase". Sé que la pregunta también menciona el uso de 'yield return', pero la respuesta es que simplemente no puede usar' yield return' para agregar elementos a una colección. – LukeH

0
foreach(Href href in hrefs) 
{ 
    yield return href; 
} 

debería ser

foreach(Href href in this.hrefs) 
{ 
    yield return href; 
} 
foreach(Href href in hrefs) 
{ 
    yield return href; 
} 
+0

Esto no está funcionando. –

+0

@Burnzy: ¿podría ser más específico? –

+0

bien si llamo addrange, la colección permanece nula. –

0
public class HrefCollection<T> : ObservableCollection<T>, IEnumerable<T> { 


// access via this[index] 
} 
Cuestiones relacionadas