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

156
24 января 2018, 12:44

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

class CCQueue<T>
{
    private LinkedList<T> _items = new LinkedList<T>();
    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<T>
{
    private CСQueue<T> _queue;
}
Answer 1

Вообще для использования foreach потребуется добавить в класс метод GetEnumerator() (можно реализовать интерфейс IEnumerable<T>, но это не обязательно - foreach будет работать и так, но, например, Linq работает только с IEnumerable<T>).

Но так, как настоящая коллекция у вас скрыта внутри CCQueue<T>, то придется реализовать метод GetEnumerator() и в этом классе. В самом простейшем случае это может выглядеть вот так:

class CCQueue<T>
{
    ...
    public IEnumerator<T> GetEnumerator() => _items.GetEnumerator();
}
class CСCol<T>
{
    ...
    public IEnumerator<T> GetEnumerator() => _queue.GetEnumerator();
}
Answer 2

Добавьте в класс CCQueue<T>, а также в класс контейнер (_items = объект очереди):

public IEnumerator<T> GetEnumerator()
{
    foreach (T item in _items)
    {
        // здесь какая-то логика
        yield return item;
    }
}
READ ALSO
ASP.Net Core, как получить все выбранные значения тегов Select?

ASP.Net Core, как получить все выбранные значения тегов Select?

Предположим я на странице леплю формочку в которой несколько элементов select, вот такой код

243
(C#, TLS) PseudoRandomFunction (PRF)

(C#, TLS) PseudoRandomFunction (PRF)

ЗдравствуйтеПишу TLS сервер

216