internal Enumerator(SingleList <T> singleList) { _list = singleList; _index = 0; _currentNode = null; _nextNode = _list.head; }
/// <summary> /// There are three scnarios, advancing from 0 to 1 /// From 1 to 2, 3, 5, i.e. regular /// Reaching the end of the collection, after which reset needs to be called; /// </summary> /// <returns></returns> public bool MoveNext() { if (_nextNode == null) { return(false); //End of collection reached } _currentNode = _nextNode; _nextNode = _nextNode.Next; _index++; return(true); }
private static IEnumerable <TResult> SelectMany <TSource, TResult>(this SingleList <TSource> list, Func <TSource, IEnumerable <TResult> > selector) { if (selector == null) { throw new ArgumentNullException(nameof(selector)); } //Create a function that just discards the index and calls the selector Func <TSource, int, IEnumerable <TResult> > selectorWithIterator = (i, n) => selector(i); return(SelectMany(list, selectorWithIterator)); }
public static IEnumerable <TSource> Where <TSource>(this SingleList <TSource> list, Predicate <TSource> predicate) { if (predicate == null) { throw new ArgumentNullException(nameof(predicate)); } //Create a function that just discards the index and calls the selector Func <TSource, int, bool> selectorWithIterator = (item, n) => predicate(item); return(Where(list, selectorWithIterator)); }
private static IEnumerable <TResult> SelectMany <TSource, TResult>(this SingleList <TSource> list, Func <TSource, int, IEnumerable <TResult> > selector) { if (list == null) { throw new ArgumentNullException(nameof(list)); } if (selector == null) { throw new ArgumentNullException(nameof(selector)); } int i = 0; foreach (TSource element in list) { foreach (TResult subElement in selector(element, i)) { yield return(subElement); } i++; } }
public static IEnumerable <TSource> Where <TSource>(this SingleList <TSource> list, Func <TSource, int, bool> predicate) { if (list == null) { throw new ArgumentNullException(nameof(list)); } if (predicate == null) { throw new ArgumentNullException(nameof(predicate)); } int i = 0; foreach (TSource element in list) { if (predicate(element, i)) { yield return(element); } i++; } }
public void Reset() { _index = 0; _currentNode = null; _nextNode = _list.head; }