Собственная коллекция, реализующая IEnumerable - PullRequest
8 голосов
/ 21 мая 2010

Я знаю, что технически интерфейс используется для чтения, а не для записи или редактирования, однако, я хочу добавить функцию добавления и добавления в следующий класс, вот то, что у меня сейчас есть, которое не работает

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

Я не совсем уверен, как связать доходность с личным списком.

Спасибо за вашу помощь!

Ответы [ 3 ]

5 голосов
/ 21 мая 2010

Интерфейсы IEnumerable<T> и IEnumerable используются для создания последовательности только для чтения или для представления элементов коллекции только для чтения.

Если вы хотите иметь возможность добавлять элементытогда для внутренней коллекции вам потребуется использовать структуру данных, которая позволяет добавлять элементы - например, List<T>.Вы просто не можете добавлять элементы, используя интерфейсы IEnumerable<T> или 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();
    }
}
1 голос
/ 21 мая 2010
foreach( Href href in hrefs )
{
    yield return href;
}

должно быть

foreach( Href href in this.hrefs )
{
    yield return href;
}
foreach( Href href in hrefs )
{
    yield return href;
}
0 голосов
/ 08 марта 2012
public class HrefCollection<T> : ObservableCollection<T>, IEnumerable<T>  {


// access via this[index]
}
...