views:

138

answers:

2

I know that technically, an Interface is used for reading and not writting or editing however, I want to add an add and addrange function to the following class, here is what I currently have which is not working

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

I'm not quite sure how to associate the yield return with the private list.

Thanks for your help!

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

should be

foreach( Href href in this.hrefs )
{
    yield return href;
}
foreach( Href href in hrefs )
{
    yield return href;
}
Eric Mickelsen
This is not working.
Burnzy
@Burnzy: could you be more specific?
Eric Mickelsen
well if I call addrange, the Collection remains null.
Burnzy
Actually, you should get rid of the private IEnumerable<Href> hrefs;. You're declaring one IEnumerable<Href> inside another. Instead, you should be referencing this.
Eric Mickelsen
@Burzy, but using yield will never add to the collection you have, only output a new collection.
Eric Mickelsen
A: 

The IEnumerable<T> and IEnumerable interfaces are used to generate a read-only sequence or provide a read-only view of the items in a collection.

If you want to be able to add items to your collection then, internally, you'll need to use a data structure that allows items to be added -- for example List<T>. You simply can't add items using the IEnumerable<T> or IEnumerable interfaces.

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();
    }
}
LukeH
This works, but it's still pretty silly and it doesn't serve the purpose of learning how yield works.
Eric Mickelsen
@tehMick: True, but the question says "I want to add an add and addrange function to the following class". I know that the question also mentions using `yield return`, but the answer is that you just can't use `yield return` to add items to a collection.
LukeH