2010-05-21 17 views
8

So che tecnicamente un'interfaccia viene utilizzata per la lettura e non per la scrittura o la modifica, tuttavia, voglio aggiungere una funzione add e addrange alla classe seguente, ecco quello che attualmente non funzionaRaccolta personalizzata Implementazione di 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(); 
    } 
} 

Non sono sicuro di come associare il rendimento restituito all'elenco privato.

Grazie per il vostro aiuto!

+1

Si può essere un po 'confuso qui. C'è una ragione per non usare semplicemente un elenco ? –

+1

"un'interfaccia è usata per leggere e non scrivere o modificare" ?? Non capisco questa affermazione. Intendi IEnumerable? – brickner

+0

Un po 'male spiegato, intendo che l'interfaccia Ienumerable non contiene un metodo "add" perché è usato per restituire oggetti dalla collezione corrente non per aggiungere o rimuovere qualcosa da esso. –

risposta

4

I IEnumerable<T> e IEnumerable interfacce vengono utilizzate per generare una sequenza di sola lettura o fornire una visualizzazione di sola lettura degli elementi in una raccolta.

Se si desidera poter aggiungere elementi alla raccolta, internamente è necessario utilizzare una struttura dati che consenta di aggiungere articoli, ad esempio List<T>. Non è possibile aggiungere elementi semplicemente utilizzando le interfacce 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

Questo funziona, ma è ancora piuttosto stupido e non ha lo scopo di imparare come funziona la resa. –

+0

@tehMick: vero, ma la domanda dice "Voglio aggiungere una funzione add e addrange alla seguente classe". So che la domanda menziona anche l'uso di "yield return", ma la risposta è che non si può semplicemente usare "yield return" per aggiungere elementi ad una collezione. – LukeH

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

dovrebbe essere

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

Questo non funziona. –

+0

@Burnzy: potresti essere più specifico? –

+0

beh se chiamo addrange, la Collezione rimane nullo. –

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


// access via this[index] 
} 
Problemi correlati