2010-05-21 15 views
8

Je sais que techniquement, une interface est utilisée pour lire et non écrire ou éditer cependant, je veux ajouter une fonction add et addrange à la classe suivante, voici ce que j'ai actuellement qui ne fonctionne pasCollection Personnalisée Implémentant 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(); 
    } 
} 

Je ne suis pas tout à fait sûr comment associer le rendement rendement à la liste privée.

Merci pour votre aide!

+1

Vous pouvez être un peu confus ici. Y a-t-il une raison pour que vous n'utilisiez pas simplement une liste ? –

+1

"une interface est utilisée pour lire et ne pas écrire ou éditer" ?? Je ne comprends pas cette déclaration. Tu veux dire IEnumerable? – brickner

+0

Je suis un peu inexplicable, je veux dire que l'interface Ienumerable ne contient pas de méthode "add" car elle est utilisée pour renvoyer des objets de la collection en cours, pas pour ajouter ou supprimer quelque chose. –

Répondre

4

Les interfaces sont utilisées IEnumerable<T> et IEnumerable pour générer une séquence de lecture seule ou de fournir une vue en lecture seule des objets dans une collection.

Si vous souhaitez pouvoir ajouter des éléments à votre collection, vous devez utiliser une structure de données permettant d'ajouter des éléments, par exemple List<T>. Vous ne pouvez simplement pas ajouter d'éléments en utilisant les interfaces IEnumerable<T> ou 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

Cela fonctionne, mais c'est encore assez bête et cela n'a pas pour but d'apprendre comment fonctionne le rendement. –

+0

@tehMick: True, mais la question dit "Je veux ajouter une fonction add et addrange à la classe suivante". Je sais que la question mentionne également l'utilisation de 'yield return', mais la réponse est que vous ne pouvez pas utiliser' yield return' pour ajouter des éléments à une collection. – LukeH

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

devrait être

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

Cela ne fonctionne pas. –

+0

@Burnzy: pourriez-vous être plus précis? –

+0

bien si j'appelle addrange, la collection reste nulle. –

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


// access via this[index] 
}