通过反编译得到System.Core程序集中System.Linq命名空间下的Enumerable类

通过反编译得到System.Core程序集中System.Linq命名空间下的Enumerable类如下所示:

using System.Collections;using System.Collections.Generic;using System.Threading;namespace System.Linq{ [__DynamicallyInvokable] public static class Enumerable {  private abstract class Iterator<TSource> : IEnumerable<TSource>, IEnumerable, IEnumerator<TSource>, IDisposable, IEnumerator  {   private int threadId;   internal int state;   internal TSource current;   public TSource Current => current;   object IEnumerator.Current => Current;   public Iterator()   {    threadId = Thread.CurrentThread.ManagedThreadId;   }   public abstract Iterator<TSource> Clone();   public virtual void Dispose()   {    current = default(TSource);    state = -1;   }   public IEnumerator<TSource> GetEnumerator()   {    if (threadId == Thread.CurrentThread.ManagedThreadId && state == 0)    {     state = 1;     return this;    }    Iterator<TSource> iterator = Clone();    iterator.state = 1;    return iterator;   }   public abstract bool MoveNext();   public abstract IEnumerable<TResult> Select<TResult>(Func<TSource, TResult> selector);   public abstract IEnumerable<TSource> Where(Func<TSource, bool> predicate);   IEnumerator IEnumerable.GetEnumerator()   {    return GetEnumerator();   }   void IEnumerator.Reset()   {    throw new NotImplementedException();   }  }  private class WhereEnumerableIterator<TSource> : Iterator<TSource>  {   private IEnumerable<TSource> source;   private Func<TSource, bool> predicate;   private IEnumerator<TSource> enumerator;   public WhereEnumerableIterator(IEnumerable<TSource> source, Func<TSource, bool> predicate)   {    this.source = source;    this.predicate = predicate;   }   public override Iterator<TSource> Clone()   {    return new WhereEnumerableIterator<TSource>(source, predicate);   }   public override void Dispose()   {    if (enumerator != null)    {     enumerator.Dispose();    }    enumerator = null;    base.Dispose();   }   public override bool MoveNext()   {    int state = base.state;    if (state != 1)    {     if (state != 2)     {      goto IL_0061;     }    }    else    {     enumerator = source.GetEnumerator();     base.state = 2;    }    while (enumerator.MoveNext())    {     TSource current = enumerator.Current;     if (predicate(current))     {      base.current = current;      return true;     }    }    Dispose();    goto IL_0061;    IL_0061:    return false;   }   public override IEnumerable<TResult> Select<TResult>(Func<TSource, TResult> selector)   {    return new WhereSelectEnumerableIterator<TSource, TResult>(source, predicate, selector);   }   public override IEnumerable<TSource> Where(Func<TSource, bool> predicate)   {    return new WhereEnumerableIterator<TSource>(source, CombinePredicates(this.predicate, predicate));   }  }  private class WhereArrayIterator<TSource> : Iterator<TSource>  {   private TSource[] source;   private Func<TSource, bool> predicate;   private int index;   public WhereArrayIterator(TSource[] source, Func<TSource, bool> predicate)   {    this.source = source;    this.predicate = predicate;   }   public override Iterator<TSource> Clone()   {    return new WhereArrayIterator<TSource>(source, predicate);   }   public override bool MoveNext()   {    if (state == 1)    {     while (index < source.Length)     {      TSource val = source[index];      index++;      if (predicate(val))      {       current = val;       return true;      }     }     Dispose();    }    return false;   }   public override IEnumerable<TResult> Select<TResult>(Func<TSource, TResult> selector)   {    return new WhereSelectArrayIterator<TSource, TResult>(source, predicate, selector);   }   public override IEnumerable<TSource> Where(Func<TSource, bool> predicate)   {    return new WhereArrayIterator<TSource>(source, CombinePredicates(this.predicate, predicate));   }  }  private class WhereListIterator<TSource> : Iterator<TSource>  {   private List<TSource> source;   private Func<TSource, bool> predicate;   private List<TSource>.Enumerator enumerator;   public WhereListIterator(List<TSource> source, Func<TSource, bool> predicate)   {    this.source = source;    this.predicate = predicate;   }   public override Iterator<TSource> Clone()   {    return new WhereListIterator<TSource>(source, predicate);   }   public override bool MoveNext()   {    int state = base.state;    if (state != 1)    {     if (state != 2)     {      goto IL_0061;     }    }    else    {     enumerator = source.GetEnumerator();     base.state = 2;    }    while (enumerator.MoveNext())    {     TSource current = enumerator.Current;     if (predicate(current))     {      base.current = current;      return true;     }    }    Dispose();    goto IL_0061;    IL_0061:    return false;   }   public override IEnumerable<TResult> Select<TResult>(Func<TSource, TResult> selector)   {    return new WhereSelectListIterator<TSource, TResult>(source, predicate, selector);   }   public override IEnumerable<TSource> Where(Func<TSource, bool> predicate)   {    return new WhereListIterator<TSource>(source, CombinePredicates(this.predicate, predicate));   }  }  private class SelectEnumerableIterator<TSource, TResult> : Iterator<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable  {   private readonly IEnumerable<TSource> _source;   private readonly Func<TSource, TResult> _selector;   private IEnumerator<TSource> _enumerator;   public SelectEnumerableIterator(IEnumerable<TSource> source, Func<TSource, TResult> selector)   {    _source = source;    _selector = selector;   }   public override Iterator<TResult> Clone()   {    return new SelectEnumerableIterator<TSource, TResult>(_source, _selector);   }   public override void Dispose()   {    if (_enumerator != null)    {     _enumerator.Dispose();     _enumerator = null;    }    base.Dispose();   }   public override bool MoveNext()   {    int state = base.state;    if (state != 1)    {     if (state != 2)     {      goto IL_005a;     }    }    else    {     _enumerator = _source.GetEnumerator();     base.state = 2;    }    if (_enumerator.MoveNext())    {     current = _selector(_enumerator.Current);     return true;    }    Dispose();    goto IL_005a;    IL_005a:    return false;   }   public override IEnumerable<TResult2> Select<TResult2>(Func<TResult, TResult2> selector)   {    return new SelectEnumerableIterator<TSource, TResult2>(_source, CombineSelectors(_selector, selector));   }   public override IEnumerable<TResult> Where(Func<TResult, bool> predicate)   {    return new WhereEnumerableIterator<TResult>(this, predicate);   }   public TResult[] ToArray()   {    LargeArrayBuilder<TResult> largeArrayBuilder = new LargeArrayBuilder<TResult>(initialize: true);    foreach (TSource item in _source)    {     largeArrayBuilder.Add(_selector(item));    }    return largeArrayBuilder.ToArray();   }   public List<TResult> ToList()   {    List<TResult> list = new List<TResult>();    foreach (TSource item in _source)    {     list.Add(_selector(item));    }    return list;   }   public int GetCount(bool onlyIfCheap)   {    if (onlyIfCheap)    {     return -1;    }    int num = 0;    foreach (TSource item in _source)    {     _selector(item);     num = checked(num + 1);    }    return num;   }  }  private class WhereSelectEnumerableIterator<TSource, TResult> : Iterator<TResult>  {   private IEnumerable<TSource> source;   private Func<TSource, bool> predicate;   private Func<TSource, TResult> selector;   private IEnumerator<TSource> enumerator;   public WhereSelectEnumerableIterator(IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, TResult> selector)   {    this.source = source;    this.predicate = predicate;    this.selector = selector;   }   public override Iterator<TResult> Clone()   {    return new WhereSelectEnumerableIterator<TSource, TResult>(source, predicate, selector);   }   public override void Dispose()   {    if (enumerator != null)    {     enumerator.Dispose();    }    enumerator = null;    base.Dispose();   }   public override bool MoveNext()   {    int state = base.state;    if (state != 1)    {     if (state != 2)     {      goto IL_0074;     }    }    else    {     enumerator = source.GetEnumerator();     base.state = 2;    }    while (enumerator.MoveNext())    {     TSource current = enumerator.Current;     if (predicate == null || predicate(current))     {      base.current = selector(current);      return true;     }    }    Dispose();    goto IL_0074;    IL_0074:    return false;   }   public override IEnumerable<TResult2> Select<TResult2>(Func<TResult, TResult2> selector)   {    return new WhereSelectEnumerableIterator<TSource, TResult2>(source, predicate, CombineSelectors(this.selector, selector));   }   public override IEnumerable<TResult> Where(Func<TResult, bool> predicate)   {    return new WhereEnumerableIterator<TResult>(this, predicate);   }  }  private class WhereSelectArrayIterator<TSource, TResult> : Iterator<TResult>  {   private TSource[] source;   private Func<TSource, bool> predicate;   private Func<TSource, TResult> selector;   private int index;   public WhereSelectArrayIterator(TSource[] source, Func<TSource, bool> predicate, Func<TSource, TResult> selector)   {    this.source = source;    this.predicate = predicate;    this.selector = selector;   }   public override Iterator<TResult> Clone()   {    return new WhereSelectArrayIterator<TSource, TResult>(source, predicate, selector);   }   public override bool MoveNext()   {    if (state == 1)    {     while (index < source.Length)     {      TSource arg = source[index];      index++;      if (predicate == null || predicate(arg))      {       current = selector(arg);       return true;      }     }     Dispose();    }    return false;   }   public override IEnumerable<TResult2> Select<TResult2>(Func<TResult, TResult2> selector)   {    return new WhereSelectArrayIterator<TSource, TResult2>(source, predicate, CombineSelectors(this.selector, selector));   }   public override IEnumerable<TResult> Where(Func<TResult, bool> predicate)   {    return new WhereEnumerableIterator<TResult>(this, predicate);   }  }  private class WhereSelectListIterator<TSource, TResult> : Iterator<TResult>  {   private List<TSource> source;   private Func<TSource, bool> predicate;   private Func<TSource, TResult> selector;   private List<TSource>.Enumerator enumerator;   public WhereSelectListIterator(List<TSource> source, Func<TSource, bool> predicate, Func<TSource, TResult> selector)   {    this.source = source;    this.predicate = predicate;    this.selector = selector;   }   public override Iterator<TResult> Clone()   {    return new WhereSelectListIterator<TSource, TResult>(source, predicate, selector);   }   public override bool MoveNext()   {    int state = base.state;    if (state != 1)    {     if (state != 2)     {      goto IL_0074;     }    }    else    {     enumerator = source.GetEnumerator();     base.state = 2;    }    while (enumerator.MoveNext())    {     TSource current = enumerator.Current;     if (predicate == null || predicate(current))     {      base.current = selector(current);      return true;     }    }    Dispose();    goto IL_0074;    IL_0074:    return false;   }   public override IEnumerable<TResult2> Select<TResult2>(Func<TResult, TResult2> selector)   {    return new WhereSelectListIterator<TSource, TResult2>(source, predicate, CombineSelectors(this.selector, selector));   }   public override IEnumerable<TResult> Where(Func<TResult, bool> predicate)   {    return new WhereEnumerableIterator<TResult>(this, predicate);   }  }  private abstract class AppendPrependIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable  {   protected readonly IEnumerable<TSource> _source;   protected IEnumerator<TSource> enumerator;   protected AppendPrependIterator(IEnumerable<TSource> source)   {    _source = source;   }   protected void GetSourceEnumerator()   {    enumerator = _source.GetEnumerator();   }   public abstract AppendPrependIterator<TSource> Append(TSource item);   public abstract AppendPrependIterator<TSource> Prepend(TSource item);   protected bool LoadFromEnumerator()   {    if (enumerator.MoveNext())    {     current = enumerator.Current;     return true;    }    Dispose();    return false;   }   public override void Dispose()   {    if (enumerator != null)    {     enumerator.Dispose();     enumerator = null;    }    base.Dispose();   }   public override IEnumerable<TResult> Select<TResult>(Func<TSource, TResult> selector)   {    return new SelectEnumerableIterator<TSource, TResult>(this, selector);   }   public override IEnumerable<TSource> Where(Func<TSource, bool> predicate)   {    return new WhereEnumerableIterator<TSource>(this, predicate);   }   public abstract TSource[] ToArray();   public abstract List<TSource> ToList();   public abstract int GetCount(bool onlyIfCheap);  }  private class AppendPrepend1Iterator<TSource> : AppendPrependIterator<TSource>  {   private readonly TSource _item;   private readonly bool _appending;   public AppendPrepend1Iterator(IEnumerable<TSource> source, TSource item, bool appending)    : base(source)   {    _item = item;    _appending = appending;   }   public override Iterator<TSource> Clone()   {    return new AppendPrepend1Iterator<TSource>(_source, _item, _appending);   }   public override bool MoveNext()   {    switch (state)    {     case 1:      state = 2;      if (!_appending)      {       current = _item;       return true;      }      goto case 2;     case 2:      GetSourceEnumerator();      state = 3;      goto case 3;     case 3:      if (LoadFromEnumerator())      {       return true;      }      if (_appending)      {       current = _item;       return true;      }      break;    }    Dispose();    return false;   }   public override AppendPrependIterator<TSource> Append(TSource item)   {    if (_appending)    {     return new AppendPrependN<TSource>(_source, null, new SingleLinkedNode<TSource>(_item).Add(item), 0, 2);    }    return new AppendPrependN<TSource>(_source, new SingleLinkedNode<TSource>(_item), new SingleLinkedNode<TSource>(item), 1, 1);   }   public override AppendPrependIterator<TSource> Prepend(TSource item)   {    if (_appending)    {     return new AppendPrependN<TSource>(_source, new SingleLinkedNode<TSource>(item), new SingleLinkedNode<TSource>(_item), 1, 1);    }    return new AppendPrependN<TSource>(_source, new SingleLinkedNode<TSource>(_item).Add(item), null, 2, 0);   }   private TSource[] LazyToArray()   {    LargeArrayBuilder<TSource> largeArrayBuilder = new LargeArrayBuilder<TSource>(initialize: true);    if (!_appending)    {     largeArrayBuilder.SlowAdd(_item);    }    largeArrayBuilder.AddRange(_source);    if (_appending)    {     largeArrayBuilder.SlowAdd(_item);    }    return largeArrayBuilder.ToArray();   }   public override TSource[] ToArray()   {    int count = GetCount(onlyIfCheap: true);    if (count == -1)    {     return LazyToArray();    }    TSource[] array = new TSource[count];    int arrayIndex;    if (_appending)    {     arrayIndex = 0;    }    else    {     array[0] = _item;     arrayIndex = 1;    }    EnumerableHelpers.Copy(_source, array, arrayIndex, count - 1);    if (_appending)    {     array[array.Length - 1] = _item;    }    return array;   }   public override List<TSource> ToList()   {    int count = GetCount(onlyIfCheap: true);    List<TSource> list = (count == -1) ? new List<TSource>() : new List<TSource>(count);    if (!_appending)    {     list.Add(_item);    }    list.AddRange(_source);    if (_appending)    {     list.Add(_item);    }    return list;   }   public override int GetCount(bool onlyIfCheap)   {    IIListProvider<TSource> iIListProvider = _source as IIListProvider<TSource>;    if (iIListProvider != null)    {     int count = iIListProvider.GetCount(onlyIfCheap);     if (count != -1)     {      return count + 1;     }     return -1;    }    if (onlyIfCheap && !(_source is ICollection<TSource>))    {     return -1;    }    return _source.Count() + 1;   }  }  private class AppendPrependN<TSource> : AppendPrependIterator<TSource>  {   private readonly SingleLinkedNode<TSource> _prepended;   private readonly SingleLinkedNode<TSource> _appended;   private readonly int _prependCount;   private readonly int _appendCount;   private SingleLinkedNode<TSource> _node;   public AppendPrependN(IEnumerable<TSource> source, SingleLinkedNode<TSource> prepended, SingleLinkedNode<TSource> appended, int prependCount, int appendCount)    : base(source)   {    _prepended = prepended;    _appended = appended;    _prependCount = prependCount;    _appendCount = appendCount;   }   public override Iterator<TSource> Clone()   {    return new AppendPrependN<TSource>(_source, _prepended, _appended, _prependCount, _appendCount);   }   public override bool MoveNext()   {    switch (state)    {     case 1:      _node = _prepended;      state = 2;      goto case 2;     case 2:      if (_node != null)      {       current = _node.Item;       _node = _node.Linked;       return true;      }      GetSourceEnumerator();      state = 3;      goto case 3;     case 3:      if (LoadFromEnumerator())      {       return true;      }      if (_appended == null)      {       return false;      }      enumerator = _appended.GetEnumerator(_appendCount);      state = 4;      goto case 4;     case 4:      return LoadFromEnumerator();     default:      Dispose();      return false;    }   }   public override AppendPrependIterator<TSource> Append(TSource item)   {    SingleLinkedNode<TSource> appended = (_appended != null) ? _appended.Add(item) : new SingleLinkedNode<TSource>(item);    return new AppendPrependN<TSource>(_source, _prepended, appended, _prependCount, _appendCount + 1);   }   public override AppendPrependIterator<TSource> Prepend(TSource item)   {    SingleLinkedNode<TSource> prepended = (_prepended != null) ? _prepended.Add(item) : new SingleLinkedNode<TSource>(item);    return new AppendPrependN<TSource>(_source, prepended, _appended, _prependCount + 1, _appendCount);   }   private TSource[] LazyToArray()   {    SparseArrayBuilder<TSource> sparseArrayBuilder = new SparseArrayBuilder<TSource>(initialize: true);    if (_prepended != null)    {     sparseArrayBuilder.Reserve(_prependCount);    }    sparseArrayBuilder.AddRange(_source);    if (_appended != null)    {     sparseArrayBuilder.Reserve(_appendCount);    }    TSource[] array = sparseArrayBuilder.ToArray();    int num = 0;    for (SingleLinkedNode<TSource> singleLinkedNode = _prepended; singleLinkedNode != null; singleLinkedNode = singleLinkedNode.Linked)    {     array[num++] = singleLinkedNode.Item;    }    num = array.Length - 1;    for (SingleLinkedNode<TSource> singleLinkedNode2 = _appended; singleLinkedNode2 != null; singleLinkedNode2 = singleLinkedNode2.Linked)    {     array[num--] = singleLinkedNode2.Item;    }    return array;   }   public override TSource[] ToArray()   {    int count = GetCount(onlyIfCheap: true);    if (count == -1)    {     return LazyToArray();    }    TSource[] array = new TSource[count];    int num = 0;    for (SingleLinkedNode<TSource> singleLinkedNode = _prepended; singleLinkedNode != null; singleLinkedNode = singleLinkedNode.Linked)    {     array[num] = singleLinkedNode.Item;     num++;    }    ICollection<TSource> collection = _source as ICollection<TSource>;    if (collection != null)    {     collection.CopyTo(array, num);    }    else    {     foreach (TSource item in _source)     {      TSource val = array[num] = item;      num++;     }    }    num = array.Length;    for (SingleLinkedNode<TSource> singleLinkedNode2 = _appended; singleLinkedNode2 != null; singleLinkedNode2 = singleLinkedNode2.Linked)    {     num--;     array[num] = singleLinkedNode2.Item;    }    return array;   }   public override List<TSource> ToList()   {    int count = GetCount(onlyIfCheap: true);    List<TSource> list = (count == -1) ? new List<TSource>() : new List<TSource>(count);    for (SingleLinkedNode<TSource> singleLinkedNode = _prepended; singleLinkedNode != null; singleLinkedNode = singleLinkedNode.Linked)    {     list.Add(singleLinkedNode.Item);    }    list.AddRange(_source);    if (_appended != null)    {     IEnumerator<TSource> enumerator = _appended.GetEnumerator(_appendCount);     while (enumerator.MoveNext())     {      list.Add(enumerator.Current);     }    }    return list;   }   public override int GetCount(bool onlyIfCheap)   {    IIListProvider<TSource> iIListProvider = _source as IIListProvider<TSource>;    if (iIListProvider != null)    {     int count = iIListProvider.GetCount(onlyIfCheap);     if (count != -1)     {      return count + _appendCount + _prependCount;     }     return -1;    }    if (onlyIfCheap && !(_source is ICollection<TSource>))    {     return -1;    }    return _source.Count() + _appendCount + _prependCount;   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (predicate == null)   {    throw Error.ArgumentNull("predicate");   }   if (source is Iterator<TSource>)   {    return ((Iterator<TSource>)source).Where(predicate);   }   if (source is TSource[])   {    return new WhereArrayIterator<TSource>((TSource[])source, predicate);   }   if (source is List<TSource>)   {    return new WhereListIterator<TSource>((List<TSource>)source, predicate);   }   return new WhereEnumerableIterator<TSource>(source, predicate);  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (predicate == null)   {    throw Error.ArgumentNull("predicate");   }   return WhereIterator(source, predicate);  }  private static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate)  {   int index = -1;   foreach (TSource item in source)   {    index = checked(index + 1);    if (predicate(item, index))    {     yield return item;    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (selector == null)   {    throw Error.ArgumentNull("selector");   }   if (source is Iterator<TSource>)   {    return ((Iterator<TSource>)source).Select(selector);   }   if (source is TSource[])   {    return new WhereSelectArrayIterator<TSource, TResult>((TSource[])source, null, selector);   }   if (source is List<TSource>)   {    return new WhereSelectListIterator<TSource, TResult>((List<TSource>)source, null, selector);   }   return new WhereSelectEnumerableIterator<TSource, TResult>(source, null, selector);  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (selector == null)   {    throw Error.ArgumentNull("selector");   }   return SelectIterator(source, selector);  }  private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector)  {   int index = -1;   foreach (TSource item in source)   {    index = checked(index + 1);    yield return selector(item, index);   }  }  private static Func<TSource, bool> CombinePredicates<TSource>(Func<TSource, bool> predicate1, Func<TSource, bool> predicate2)  {   return (TSource x) => predicate1(x) && predicate2(x);  }  private static Func<TSource, TResult> CombineSelectors<TSource, TMiddle, TResult>(Func<TSource, TMiddle> selector1, Func<TMiddle, TResult> selector2)  {   return (TSource x) => selector2(selector1(x));  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (selector == null)   {    throw Error.ArgumentNull("selector");   }   return SelectManyIterator(source, selector);  }  private static IEnumerable<TResult> SelectManyIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)  {   foreach (TSource item in source)   {    foreach (TResult item2 in selector(item))    {     yield return item2;    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (selector == null)   {    throw Error.ArgumentNull("selector");   }   return SelectManyIterator(source, selector);  }  private static IEnumerable<TResult> SelectManyIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector)  {   int index = -1;   foreach (TSource item in source)   {    index = checked(index + 1);    foreach (TResult item2 in selector(item, index))    {     yield return item2;    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (collectionSelector == null)   {    throw Error.ArgumentNull("collectionSelector");   }   if (resultSelector == null)   {    throw Error.ArgumentNull("resultSelector");   }   return SelectManyIterator(source, collectionSelector, resultSelector);  }  private static IEnumerable<TResult> SelectManyIterator<TSource, TCollection, TResult>(IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)  {   int index = -1;   foreach (TSource element in source)   {    index = checked(index + 1);    foreach (TCollection item in collectionSelector(element, index))    {     yield return resultSelector(element, item);    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (collectionSelector == null)   {    throw Error.ArgumentNull("collectionSelector");   }   if (resultSelector == null)   {    throw Error.ArgumentNull("resultSelector");   }   return SelectManyIterator(source, collectionSelector, resultSelector);  }  private static IEnumerable<TResult> SelectManyIterator<TSource, TCollection, TResult>(IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)  {   foreach (TSource element in source)   {    foreach (TCollection item in collectionSelector(element))    {     yield return resultSelector(element, item);    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   return TakeIterator(source, count);  }  private static IEnumerable<TSource> TakeIterator<TSource>(IEnumerable<TSource> source, int count)  {   if (count > 0)   {    foreach (TSource item in source)    {     yield return item;     int num = count - 1;     count = num;     if (num == 0)     {      break;     }    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (predicate == null)   {    throw Error.ArgumentNull("predicate");   }   return TakeWhileIterator(source, predicate);  }  private static IEnumerable<TSource> TakeWhileIterator<TSource>(IEnumerable<TSource> source, Func<TSource, bool> predicate)  {   foreach (TSource item in source)   {    if (!predicate(item))    {     break;    }    yield return item;   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (predicate == null)   {    throw Error.ArgumentNull("predicate");   }   return TakeWhileIterator(source, predicate);  }  private static IEnumerable<TSource> TakeWhileIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate)  {   int index = -1;   foreach (TSource item in source)   {    index = checked(index + 1);    if (!predicate(item, index))    {     break;    }    yield return item;   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Skip<TSource>(this IEnumerable<TSource> source, int count)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   return SkipIterator(source, count);  }  private static IEnumerable<TSource> SkipIterator<TSource>(IEnumerable<TSource> source, int count)  {   using (IEnumerator<TSource> e = source.GetEnumerator())   {    while (count > 0 && e.MoveNext())    {     count--;    }    if (count <= 0)    {     while (e.MoveNext())     {      yield return e.Current;     }    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> SkipWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (predicate == null)   {    throw Error.ArgumentNull("predicate");   }   return SkipWhileIterator(source, predicate);  }  private static IEnumerable<TSource> SkipWhileIterator<TSource>(IEnumerable<TSource> source, Func<TSource, bool> predicate)  {   bool yielding = false;   foreach (TSource item in source)   {    if (!yielding && !predicate(item))    {     yielding = true;    }    if (yielding)    {     yield return item;    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> SkipWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   if (predicate == null)   {    throw Error.ArgumentNull("predicate");   }   return SkipWhileIterator(source, predicate);  }  private static IEnumerable<TSource> SkipWhileIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate)  {   int index = -1;   bool yielding = false;   foreach (TSource item in source)   {    index = checked(index + 1);    if (!yielding && !predicate(item, index))    {     yielding = true;    }    if (yielding)    {     yield return item;    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector)  {   if (outer == null)   {    throw Error.ArgumentNull("outer");   }   if (inner == null)   {    throw Error.ArgumentNull("inner");   }   if (outerKeySelector == null)   {    throw Error.ArgumentNull("outerKeySelector");   }   if (innerKeySelector == null)   {    throw Error.ArgumentNull("innerKeySelector");   }   if (resultSelector == null)   {    throw Error.ArgumentNull("resultSelector");   }   return JoinIterator(outer, inner, outerKeySelector, innerKeySelector, resultSelector, null);  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector, IEqualityComparer<TKey> comparer)  {   if (outer == null)   {    throw Error.ArgumentNull("outer");   }   if (inner == null)   {    throw Error.ArgumentNull("inner");   }   if (outerKeySelector == null)   {    throw Error.ArgumentNull("outerKeySelector");   }   if (innerKeySelector == null)   {    throw Error.ArgumentNull("innerKeySelector");   }   if (resultSelector == null)   {    throw Error.ArgumentNull("resultSelector");   }   return JoinIterator(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer);  }  private static IEnumerable<TResult> JoinIterator<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector, IEqualityComparer<TKey> comparer)  {   Lookup<TKey, TInner> lookup = Lookup<TKey, TInner>.CreateForJoin(inner, innerKeySelector, comparer);   foreach (TOuter item in outer)   {    Lookup<TKey, TInner>.Grouping g = lookup.GetGrouping(outerKeySelector(item), create: false);    if (g != null)    {     for (int i = 0; i < g.count; i++)     {      yield return resultSelector(item, g.elements[i]);     }    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector)  {   if (outer == null)   {    throw Error.ArgumentNull("outer");   }   if (inner == null)   {    throw Error.ArgumentNull("inner");   }   if (outerKeySelector == null)   {    throw Error.ArgumentNull("outerKeySelector");   }   if (innerKeySelector == null)   {    throw Error.ArgumentNull("innerKeySelector");   }   if (resultSelector == null)   {    throw Error.ArgumentNull("resultSelector");   }   return GroupJoinIterator(outer, inner, outerKeySelector, innerKeySelector, resultSelector, null);  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector, IEqualityComparer<TKey> comparer)  {   if (outer == null)   {    throw Error.ArgumentNull("outer");   }   if (inner == null)   {    throw Error.ArgumentNull("inner");   }   if (outerKeySelector == null)   {    throw Error.ArgumentNull("outerKeySelector");   }   if (innerKeySelector == null)   {    throw Error.ArgumentNull("innerKeySelector");   }   if (resultSelector == null)   {    throw Error.ArgumentNull("resultSelector");   }   return GroupJoinIterator(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer);  }  private static IEnumerable<TResult> GroupJoinIterator<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector, IEqualityComparer<TKey> comparer)  {   Lookup<TKey, TInner> lookup = Lookup<TKey, TInner>.CreateForJoin(inner, innerKeySelector, comparer);   foreach (TOuter item in outer)   {    yield return resultSelector(item, lookup[outerKeySelector(item)]);   }  }  [__DynamicallyInvokable]  public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)  {   return new OrderedEnumerable<TSource, TKey>(source, keySelector, null, descending: false);  }  [__DynamicallyInvokable]  public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)  {   return new OrderedEnumerable<TSource, TKey>(source, keySelector, comparer, descending: false);  }  [__DynamicallyInvokable]  public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)  {   return new OrderedEnumerable<TSource, TKey>(source, keySelector, null, descending: true);  }  [__DynamicallyInvokable]  public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)  {   return new OrderedEnumerable<TSource, TKey>(source, keySelector, comparer, descending: true);  }  [__DynamicallyInvokable]  public static IOrderedEnumerable<TSource> ThenBy<TSource, TKey>(this IOrderedEnumerable<TSource> source, Func<TSource, TKey> keySelector)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   return source.CreateOrderedEnumerable(keySelector, null, descending: false);  }  [__DynamicallyInvokable]  public static IOrderedEnumerable<TSource> ThenBy<TSource, TKey>(this IOrderedEnumerable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   return source.CreateOrderedEnumerable(keySelector, comparer, descending: false);  }  [__DynamicallyInvokable]  public static IOrderedEnumerable<TSource> ThenByDescending<TSource, TKey>(this IOrderedEnumerable<TSource> source, Func<TSource, TKey> keySelector)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   return source.CreateOrderedEnumerable(keySelector, null, descending: true);  }  [__DynamicallyInvokable]  public static IOrderedEnumerable<TSource> ThenByDescending<TSource, TKey>(this IOrderedEnumerable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   return source.CreateOrderedEnumerable(keySelector, comparer, descending: true);  }  [__DynamicallyInvokable]  public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)  {   return new GroupedEnumerable<TSource, TKey, TSource>(source, keySelector, IdentityFunction<TSource>.Instance, null);  }  [__DynamicallyInvokable]  public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)  {   return new GroupedEnumerable<TSource, TKey, TSource>(source, keySelector, IdentityFunction<TSource>.Instance, comparer);  }  [__DynamicallyInvokable]  public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)  {   return new GroupedEnumerable<TSource, TKey, TElement>(source, keySelector, elementSelector, null);  }  [__DynamicallyInvokable]  public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)  {   return new GroupedEnumerable<TSource, TKey, TElement>(source, keySelector, elementSelector, comparer);  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector)  {   return new GroupedEnumerable<TSource, TKey, TSource, TResult>(source, keySelector, IdentityFunction<TSource>.Instance, resultSelector, null);  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector)  {   return new GroupedEnumerable<TSource, TKey, TElement, TResult>(source, keySelector, elementSelector, resultSelector, null);  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector, IEqualityComparer<TKey> comparer)  {   return new GroupedEnumerable<TSource, TKey, TSource, TResult>(source, keySelector, IdentityFunction<TSource>.Instance, resultSelector, comparer);  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector, IEqualityComparer<TKey> comparer)  {   return new GroupedEnumerable<TSource, TKey, TElement, TResult>(source, keySelector, elementSelector, resultSelector, comparer);  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)  {   if (first == null)   {    throw Error.ArgumentNull("first");   }   if (second == null)   {    throw Error.ArgumentNull("second");   }   return ConcatIterator(first, second);  }  private static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second)  {   foreach (TSource item in first)   {    yield return item;   }   foreach (TSource item2 in second)   {    yield return item2;   }  }  [__DynamicallyInvokable]  public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)  {   if (first == null)   {    throw Error.ArgumentNull("first");   }   if (second == null)   {    throw Error.ArgumentNull("second");   }   if (resultSelector == null)   {    throw Error.ArgumentNull("resultSelector");   }   return ZipIterator(first, second, resultSelector);  }  private static IEnumerable<TResult> ZipIterator<TFirst, TSecond, TResult>(IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)  {   using (IEnumerator<TFirst> e3 = first.GetEnumerator())   {    using (IEnumerator<TSecond> e2 = second.GetEnumerator())    {     while (e3.MoveNext() && e2.MoveNext())     {      yield return resultSelector(e3.Current, e2.Current);     }    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   return DistinctIterator(source, null);  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)  {   if (source == null)   {    throw Error.ArgumentNull("source");   }   return DistinctIterator(source, comparer);  }  private static IEnumerable<TSource> DistinctIterator<TSource>(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)  {   Set<TSource> set = new Set<TSource>(comparer);   foreach (TSource item in source)   {    if (set.Add(item))    {     yield return item;    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)  {   if (first == null)   {    throw Error.ArgumentNull("first");   }   if (second == null)   {    throw Error.ArgumentNull("second");   }   return UnionIterator(first, second, null);  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)  {   if (first == null)   {    throw Error.ArgumentNull("first");   }   if (second == null)   {    throw Error.ArgumentNull("second");   }   return UnionIterator(first, second, comparer);  }  private static IEnumerable<TSource> UnionIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)  {   Set<TSource> set = new Set<TSource>(comparer);   foreach (TSource item in first)   {    if (set.Add(item))    {     yield return item;    }   }   foreach (TSource item2 in second)   {    if (set.Add(item2))    {     yield return item2;    }   }  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)  {   if (first == null)   {    throw Error.ArgumentNull("first");   }   if (second == null)   {    throw Error.ArgumentNull("second");   }   return IntersectIterator(first, second, null);  }  [__DynamicallyInvokable]  public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)  {   if (first == null)   {    throw Error.ArgumentNull("first");   }   if (second == null)   {    throw Error.ArgumentNull("second");   }   return IntersectIterator(first, second, comparer);  }  private static IEnumerable<TSource> IntersectIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)  {   Set<TSource> set = new Set<TSource>(comparer);   foreach (TSource item in second)   {    set.A.........