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);
                    }
                }
Example #2
0
 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);
         }
     }
 }
Example #3
0
 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;
 }