public bool MoveNext() { switch (state) { case EnumeratorState.Enumerating: if (++sourceIndex >= end) { state = EnumeratorState.Complete; return(false); } var enumerable = selector.Invoke(source[sourceIndex]); subEnumerator = enumerable.GetEnumerator(); state = EnumeratorState.EnumeratingSub; goto case EnumeratorState.EnumeratingSub; case EnumeratorState.EnumeratingSub: if (!subEnumerator.MoveNext()) { state = EnumeratorState.Enumerating; goto case EnumeratorState.Enumerating; } return(true); default: return(false); } }
public bool MoveNext() { if (first) { first = false; while (enumerator.MoveNext()) { sub = mapper(enumerator.Current).GetEnumerator(); if (sub.MoveNext()) { return(true); } } return(false); } else { if (!sub.MoveNext()) { while (enumerator.MoveNext()) { sub = mapper(enumerator.Current).GetEnumerator(); if (sub.MoveNext()) { return(true); } } return(false); } else { return(true); } } }
public Enumerator(TEnumerator enumerator, Func <TS, Enumerable <TSubEnumerable, TSubEnumerator, TR> > mapper) { this.enumerator = enumerator; this.mapper = mapper; sub = new TSubEnumerator(); first = true; }
internal Enumerator(SpanSelectManyEnumerable <TSource, TSubEnumerable, TSubEnumerator, TResult, TSelector> enumerable) { source = enumerable.source; selector = enumerable.selector; state = EnumeratorState.Enumerating; sourceIndex = -1; end = sourceIndex + enumerable.source.Length; subEnumerator = default; }