Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Реализовать foreach для обобщенного класса

#c_sharp


Есть класс - реализация очереди через List

class CCQueue
{
    private LinkedList _items = new LinkedList();

    public void Enqueue(T value)
    {
        _items.AddFirst(value);

    }

    public T Dequeue()
    {
        if (_items.Count == 0)
        {
            throw new Exception("Queue Empty");
        }

        T last = _items.Last.Value;

        _items.RemoveLast();

        return last;
    }

    public T Peek()
    {
        if (_items.Count == 0)
        {
            throw new Exception("Queue is empty");
        }

        return _items.Last.Value;
    }
}


Есть класс-контейнер в котором CCQueue используется в качестве хранилища. Никак не
пойму как реализовать foreach для класса контейнера. 

class CСCol
{
    private CСQueue _queue;
}

    


Ответы

Ответ 1



Вообще для использования foreach потребуется добавить в класс метод GetEnumerator() (можно реализовать интерфейс IEnumerable, но это не обязательно - foreach будет работать и так, но, например, Linq работает только с IEnumerable). Но так, как настоящая коллекция у вас скрыта внутри CCQueue, то придется реализовать метод GetEnumerator() и в этом классе. В самом простейшем случае это может выглядеть вот так: class CCQueue { ... public IEnumerator GetEnumerator() => _items.GetEnumerator(); } class CСCol { ... public IEnumerator GetEnumerator() => _queue.GetEnumerator(); }

Ответ 2



Добавьте в класс CCQueue, а также в класс контейнер (_items = объект очереди): public IEnumerator GetEnumerator() { foreach (T item in _items) { // здесь какая-то логика yield return item; } }

Комментариев нет:

Отправить комментарий