As part of the practice, I created minimalist linked list named SimpleList
which can be iterated in two different ways: one element after another or by every second element.
Because I'm beginner I would really appreciate your opinion about my solution. Is it correct? What should I change?
public class SimpleList<T> : IEnumerable<T>
{
protected class Node
{
public T Data { get; set; }
public Node NextNode { get; set; }
public Node(T data, Node nextNode)
{
Data = data;
NextNode = nextNode;
}
}
protected Node Head { get; set; } = null;
public void Add(T data)
{
Head = new Node(data, Head);
}
#region IEnumerable<T> implementation
public IEnumerator<T> GetEnumerator()
{
var current = Head;
while (current != null)
{
yield return current.Data;
current = current.NextNode;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
#region second iterator implementation
private class EverySecondElementIterator : IEnumerable<T>
{
private readonly Node head;
public EverySecondElementIterator(Node head)
{
this.head = head;
}
public IEnumerator<T> GetEnumerator()
{
var current = head;
while (current != null)
{
yield return current.Data;
current = current.NextNode?.NextNode;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public IEnumerable<T> EverySecondElement => new EverySecondElementIterator(Head);
#endregion
}