10
votes

Collection personnalisée implémentant iEnumerable

Je sais que techniquement, une interface est utilisée pour lire et ne pas écrire ou modifier cependant, je souhaite ajouter une fonction Ajout et AddRange à la classe suivante, voici ce que j'ai actuellement ce qui ne fonctionne pas

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();
    }
}


4 commentaires

Vous êtes peut-être un peu confus ici. Y a-t-il une raison pour vous de ne pas utiliser simplement une liste ?


"Une interface est utilisée pour lire et ne pas écrire ou éditer" ?? Je ne comprends pas cette déclaration. Vous voulez dire iEnumerable?


Je suis un peu miscoulé, je veux dire que l'interface iEnumerable ne contient pas de méthode "Ajouter" car elle est utilisée pour renvoyer des objets de la collection actuelle non pour ajouter ou enlever quelque chose de celui-ci.


Je ne veux pas utiliser la liste (même si je pouvais implémenter IList), je souhaite utiliser le rendement de rendement et bien comprendre comment cela fonctionne et comment je peux l'utiliser.


3 Réponses :


1
votes
foreach( Href href in this.hrefs )
{
    yield return href;
}
foreach( Href href in hrefs )
{
    yield return href;
}

4 commentaires

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


Eh bien, si j'appelle Addrange, la collection reste nulle.


En fait, vous devriez vous débarrasser de l'Ienumerable privé hrefs; . Vous déclarez une iNeumable à l'intérieur d'une autre. Au lieu de cela, vous devriez vous référencer.


@Burzy, mais en utilisant le rendement n'ajoutera jamais à la collection que vous avez, sortie une nouvelle collection.



6
votes

Le iEnumerable et iEnumerable Les interfaces sont utilisées pour générer une séquence en lecture seule ou fournir une vue en lecture seule des éléments 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 Liste . Vous ne pouvez tout simplement pas ajouter des éléments à l'aide du ienumerable ou iEnumerable interfaces. xxx


2 commentaires

Cela fonctionne, mais c'est toujours assez stupide et cela ne sert pas au but d'apprendre à quel point le rendement fonctionne.


@tehmick: True, mais la question indique "Je veux ajouter une fonction add and AddRange à la classe suivante". Je sais que la question mentionne également à l'aide de retour , mais la réponse est que vous ne pouvez tout simplement pas utiliser retour de rendement pour ajouter des éléments à une collection.



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


// access via this[index]
}

0 commentaires