• 通过反编译得到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.Add(item);
                }
    
                foreach (TSource item2 in first)
                {
                    if (set.Remove(item2))
                    {
                        yield return item2;
                    }
                }
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
            {
                if (first == null)
                {
                    throw Error.ArgumentNull("first");
                }
    
                if (second == null)
                {
                    throw Error.ArgumentNull("second");
                }
    
                return ExceptIterator(first, second, null);
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TSource> Except<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 ExceptIterator(first, second, comparer);
            }
    
            private static IEnumerable<TSource> ExceptIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
            {
                Set<TSource> set = new Set<TSource>(comparer);
                foreach (TSource item in second)
                {
                    set.Add(item);
                }
    
                foreach (TSource item2 in first)
                {
                    if (set.Add(item2))
                    {
                        yield return item2;
                    }
                }
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                return ReverseIterator(source);
            }
    
            private static IEnumerable<TSource> ReverseIterator<TSource>(IEnumerable<TSource> source)
            {
                Buffer<TSource> buffer = new Buffer<TSource>(source);
                for (int i = buffer.count - 1; i >= 0; i--)
                {
                    yield return buffer.items[i];
                }
            }
    
            [__DynamicallyInvokable]
            public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
            {
                return first.SequenceEqual(second, null);
            }
    
            [__DynamicallyInvokable]
            public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
            {
                if (comparer == null)
                {
                    comparer = EqualityComparer<TSource>.Default;
                }
    
                if (first == null)
                {
                    throw Error.ArgumentNull("first");
                }
    
                if (second == null)
                {
                    throw Error.ArgumentNull("second");
                }
    
                using (IEnumerator<TSource> enumerator = first.GetEnumerator())
                {
                    using (IEnumerator<TSource> enumerator2 = second.GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            if (!enumerator2.MoveNext() || !comparer.Equals(enumerator.Current, enumerator2.Current))
                            {
                                return false;
                            }
                        }
    
                        if (enumerator2.MoveNext())
                        {
                            return false;
                        }
                    }
                }
    
                return true;
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source)
            {
                return source;
            }
    
            [__DynamicallyInvokable]
            public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                return new Buffer<TSource>(source).ToArray();
            }
    
            [__DynamicallyInvokable]
            public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                return new List<TSource>(source);
            }
    
            [__DynamicallyInvokable]
            public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
            {
                return source.ToDictionary(keySelector, IdentityFunction<TSource>.Instance, null);
            }
    
            [__DynamicallyInvokable]
            public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
            {
                return source.ToDictionary(keySelector, IdentityFunction<TSource>.Instance, comparer);
            }
    
            [__DynamicallyInvokable]
            public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
            {
                return source.ToDictionary(keySelector, elementSelector, null);
            }
    
            [__DynamicallyInvokable]
            public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (keySelector == null)
                {
                    throw Error.ArgumentNull("keySelector");
                }
    
                if (elementSelector == null)
                {
                    throw Error.ArgumentNull("elementSelector");
                }
    
                Dictionary<TKey, TElement> dictionary = new Dictionary<TKey, TElement>(comparer);
                foreach (TSource item in source)
                {
                    dictionary.Add(keySelector(item), elementSelector(item));
                }
    
                return dictionary;
            }
    
            [__DynamicallyInvokable]
            public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
            {
                return Lookup<TKey, TSource>.Create(source, keySelector, IdentityFunction<TSource>.Instance, null);
            }
    
            [__DynamicallyInvokable]
            public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
            {
                return Lookup<TKey, TSource>.Create(source, keySelector, IdentityFunction<TSource>.Instance, comparer);
            }
    
            [__DynamicallyInvokable]
            public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
            {
                return Lookup<TKey, TElement>.Create(source, keySelector, elementSelector, null);
            }
    
            [__DynamicallyInvokable]
            public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
            {
                return Lookup<TKey, TElement>.Create(source, keySelector, elementSelector, comparer);
            }
    
            public static HashSet<TSource> ToHashSet<TSource>(this IEnumerable<TSource> source)
            {
                return source.ToHashSet(null);
            }
    
            public static HashSet<TSource> ToHashSet<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                return new HashSet<TSource>(source, comparer);
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TSource> DefaultIfEmpty<TSource>(this IEnumerable<TSource> source)
            {
                return source.DefaultIfEmpty(default(TSource));
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TSource> DefaultIfEmpty<TSource>(this IEnumerable<TSource> source, TSource defaultValue)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                return DefaultIfEmptyIterator(source, defaultValue);
            }
    
            private static IEnumerable<TSource> DefaultIfEmptyIterator<TSource>(IEnumerable<TSource> source, TSource defaultValue)
            {
                using (IEnumerator<TSource> e = source.GetEnumerator())
                {
                    if (e.MoveNext())
                    {
                        do
                        {
                            yield return e.Current;
                        }
                        while (e.MoveNext());
                    }
                    else
                    {
                        yield return defaultValue;
                    }
                }
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                return OfTypeIterator<TResult>(source);
            }
    
            private static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source)
            {
                foreach (object item in source)
                {
                    if (item is TResult)
                    {
                        yield return (TResult)item;
                    }
                }
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)
            {
                IEnumerable<TResult> enumerable = source as IEnumerable<TResult>;
                if (enumerable != null)
                {
                    return enumerable;
                }
    
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                return CastIterator<TResult>(source);
            }
    
            private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
            {
                foreach (object item in source)
                {
                    yield return (TResult)item;
                }
            }
    
            [__DynamicallyInvokable]
            public static TSource First<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                IList<TSource> list = source as IList<TSource>;
                if (list != null)
                {
                    if (list.Count > 0)
                    {
                        return list[0];
                    }
                }
                else
                {
                    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                    {
                        if (enumerator.MoveNext())
                        {
                            return enumerator.Current;
                        }
                    }
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        return item;
                    }
                }
    
                throw Error.NoMatch();
            }
    
            [__DynamicallyInvokable]
            public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                IList<TSource> list = source as IList<TSource>;
                if (list != null)
                {
                    if (list.Count > 0)
                    {
                        return list[0];
                    }
                }
                else
                {
                    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                    {
                        if (enumerator.MoveNext())
                        {
                            return enumerator.Current;
                        }
                    }
                }
    
                return default(TSource);
            }
    
            [__DynamicallyInvokable]
            public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        return item;
                    }
                }
    
                return default(TSource);
            }
    
            [__DynamicallyInvokable]
            public static TSource Last<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                IList<TSource> list = source as IList<TSource>;
                if (list != null)
                {
                    int count = list.Count;
                    if (count > 0)
                    {
                        return list[count - 1];
                    }
                }
                else
                {
                    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                    {
                        if (enumerator.MoveNext())
                        {
                            TSource current;
                            do
                            {
                                current = enumerator.Current;
                            }
                            while (enumerator.MoveNext());
                            return current;
                        }
                    }
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static TSource Last<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                TSource result = default(TSource);
                bool flag = false;
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        result = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return result;
                }
    
                throw Error.NoMatch();
            }
    
            [__DynamicallyInvokable]
            public static TSource LastOrDefault<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                IList<TSource> list = source as IList<TSource>;
                if (list != null)
                {
                    int count = list.Count;
                    if (count > 0)
                    {
                        return list[count - 1];
                    }
                }
                else
                {
                    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                    {
                        if (enumerator.MoveNext())
                        {
                            TSource current;
                            do
                            {
                                current = enumerator.Current;
                            }
                            while (enumerator.MoveNext());
                            return current;
                        }
                    }
                }
    
                return default(TSource);
            }
    
            [__DynamicallyInvokable]
            public static TSource LastOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                TSource result = default(TSource);
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        result = item;
                    }
                }
    
                return result;
            }
    
            [__DynamicallyInvokable]
            public static TSource Single<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                IList<TSource> list = source as IList<TSource>;
                if (list != null)
                {
                    switch (list.Count)
                    {
                        case 0:
                            throw Error.NoElements();
                        case 1:
                            return list[0];
                    }
                }
                else
                {
                    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                    {
                        if (!enumerator.MoveNext())
                        {
                            throw Error.NoElements();
                        }
    
                        TSource current = enumerator.Current;
                        if (!enumerator.MoveNext())
                        {
                            return current;
                        }
                    }
                }
    
                throw Error.MoreThanOneElement();
            }
    
            [__DynamicallyInvokable]
            public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                TSource result = default(TSource);
                long num = 0L;
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        result = item;
                        num = checked(num + 1);
                    }
                }
    
                switch (num)
                {
                    case 0L:
                        throw Error.NoMatch();
                    case 1L:
                        return result;
                    default:
                        throw Error.MoreThanOneMatch();
                }
            }
    
            [__DynamicallyInvokable]
            public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                IList<TSource> list = source as IList<TSource>;
                if (list != null)
                {
                    switch (list.Count)
                    {
                        case 0:
                            return default(TSource);
                        case 1:
                            return list[0];
                    }
                }
                else
                {
                    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                    {
                        if (!enumerator.MoveNext())
                        {
                            return default(TSource);
                        }
    
                        TSource current = enumerator.Current;
                        if (!enumerator.MoveNext())
                        {
                            return current;
                        }
                    }
                }
    
                throw Error.MoreThanOneElement();
            }
    
            [__DynamicallyInvokable]
            public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                TSource result = default(TSource);
                long num = 0L;
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        result = item;
                        num = checked(num + 1);
                    }
                }
    
                switch (num)
                {
                    case 0L:
                        return default(TSource);
                    case 1L:
                        return result;
                    default:
                        throw Error.MoreThanOneMatch();
                }
            }
    
            [__DynamicallyInvokable]
            public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                IList<TSource> list = source as IList<TSource>;
                if (list != null)
                {
                    return list[index];
                }
    
                if (index < 0)
                {
                    throw Error.ArgumentOutOfRange("index");
                }
    
                using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        if (index == 0)
                        {
                            return enumerator.Current;
                        }
    
                        index--;
                    }
    
                    throw Error.ArgumentOutOfRange("index");
                }
            }
    
            [__DynamicallyInvokable]
            public static TSource ElementAtOrDefault<TSource>(this IEnumerable<TSource> source, int index)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (index >= 0)
                {
                    IList<TSource> list = source as IList<TSource>;
                    if (list != null)
                    {
                        if (index < list.Count)
                        {
                            return list[index];
                        }
                    }
                    else
                    {
                        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                if (index == 0)
                                {
                                    return enumerator.Current;
                                }
    
                                index--;
                            }
                        }
                    }
                }
    
                return default(TSource);
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<int> Range(int start, int count)
            {
                long num = (long)start + (long)count - 1;
                if (count < 0 || num > int.MaxValue)
                {
                    throw Error.ArgumentOutOfRange("count");
                }
    
                return RangeIterator(start, count);
            }
    
            private static IEnumerable<int> RangeIterator(int start, int count)
            {
                for (int i = 0; i < count; i++)
                {
                    yield return start + i;
                }
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TResult> Repeat<TResult>(TResult element, int count)
            {
                if (count < 0)
                {
                    throw Error.ArgumentOutOfRange("count");
                }
    
                return RepeatIterator(element, count);
            }
    
            private static IEnumerable<TResult> RepeatIterator<TResult>(TResult element, int count)
            {
                for (int i = 0; i < count; i++)
                {
                    yield return element;
                }
            }
    
            [__DynamicallyInvokable]
            public static IEnumerable<TResult> Empty<TResult>()
            {
                return EmptyEnumerable<TResult>.Instance;
            }
    
            [__DynamicallyInvokable]
            public static bool Any<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                {
                    if (enumerator.MoveNext())
                    {
                        return true;
                    }
                }
    
                return false;
            }
    
            [__DynamicallyInvokable]
            public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        return true;
                    }
                }
    
                return false;
            }
    
            [__DynamicallyInvokable]
            public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                foreach (TSource item in source)
                {
                    if (!predicate(item))
                    {
                        return false;
                    }
                }
    
                return true;
            }
    
            [__DynamicallyInvokable]
            public static int Count<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                ICollection<TSource> collection = source as ICollection<TSource>;
                if (collection != null)
                {
                    return collection.Count;
                }
    
                ICollection collection2 = source as ICollection;
                if (collection2 != null)
                {
                    return collection2.Count;
                }
    
                int num = 0;
                using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        num = checked(num + 1);
                    }
    
                    return num;
                }
            }
    
            [__DynamicallyInvokable]
            public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                int num = 0;
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        num = checked(num + 1);
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static long LongCount<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        num = checked(num + 1);
                    }
    
                    return num;
                }
            }
    
            [__DynamicallyInvokable]
            public static long LongCount<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (predicate == null)
                {
                    throw Error.ArgumentNull("predicate");
                }
    
                long num = 0L;
                foreach (TSource item in source)
                {
                    if (predicate(item))
                    {
                        num = checked(num + 1);
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value)
            {
                return (source as ICollection<TSource>)?.Contains(value) ?? source.Contains(value, null);
            }
    
            [__DynamicallyInvokable]
            public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer)
            {
                if (comparer == null)
                {
                    comparer = EqualityComparer<TSource>.Default;
                }
    
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                foreach (TSource item in source)
                {
                    if (comparer.Equals(item, value))
                    {
                        return true;
                    }
                }
    
                return false;
            }
    
            [__DynamicallyInvokable]
            public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (func == null)
                {
                    throw Error.ArgumentNull("func");
                }
    
                using (IEnumerator<TSource> enumerator = source.GetEnumerator())
                {
                    if (!enumerator.MoveNext())
                    {
                        throw Error.NoElements();
                    }
    
                    TSource val = enumerator.Current;
                    while (enumerator.MoveNext())
                    {
                        val = func(val, enumerator.Current);
                    }
    
                    return val;
                }
            }
    
            [__DynamicallyInvokable]
            public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (func == null)
                {
                    throw Error.ArgumentNull("func");
                }
    
                TAccumulate val = seed;
                foreach (TSource item in source)
                {
                    val = func(val, item);
                }
    
                return val;
            }
    
            [__DynamicallyInvokable]
            public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                if (func == null)
                {
                    throw Error.ArgumentNull("func");
                }
    
                if (resultSelector == null)
                {
                    throw Error.ArgumentNull("resultSelector");
                }
    
                TAccumulate val = seed;
                foreach (TSource item in source)
                {
                    val = func(val, item);
                }
    
                return resultSelector(val);
            }
    
            [__DynamicallyInvokable]
            public static int Sum(this IEnumerable<int> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                int num = 0;
                foreach (int item in source)
                {
                    num = checked(num + item);
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static int? Sum(this IEnumerable<int?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                int num = 0;
                foreach (int? item in source)
                {
                    if (item.HasValue)
                    {
                        num = checked(num + item.GetValueOrDefault());
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static long Sum(this IEnumerable<long> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                foreach (long item in source)
                {
                    num = checked(num + item);
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static long? Sum(this IEnumerable<long?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                foreach (long? item in source)
                {
                    if (item.HasValue)
                    {
                        num = checked(num + item.GetValueOrDefault());
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static float Sum(this IEnumerable<float> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                foreach (float item in source)
                {
                    num += (double)item;
                }
    
                return (float)num;
            }
    
            [__DynamicallyInvokable]
            public static float? Sum(this IEnumerable<float?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                foreach (float? item in source)
                {
                    if (item.HasValue)
                    {
                        num += (double)item.GetValueOrDefault();
                    }
                }
    
                return (float)num;
            }
    
            [__DynamicallyInvokable]
            public static double Sum(this IEnumerable<double> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                foreach (double item in source)
                {
                    num += item;
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static double? Sum(this IEnumerable<double?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                foreach (double? item in source)
                {
                    if (item.HasValue)
                    {
                        num += item.GetValueOrDefault();
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static decimal Sum(this IEnumerable<decimal> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                decimal result = default(decimal);
                foreach (decimal item in source)
                {
                    result += item;
                }
    
                return result;
            }
    
            [__DynamicallyInvokable]
            public static decimal? Sum(this IEnumerable<decimal?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                decimal value = default(decimal);
                foreach (decimal? item in source)
                {
                    if (item.HasValue)
                    {
                        value += item.GetValueOrDefault();
                    }
                }
    
                return value;
            }
    
            [__DynamicallyInvokable]
            public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static int? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int?> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static long Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static long? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, long?> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static float Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, float> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static float? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, float?> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static double Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static double? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, double?> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static decimal Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static decimal? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
            {
                return source.Select(selector).Sum();
            }
    
            [__DynamicallyInvokable]
            public static int Min(this IEnumerable<int> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                int num = 0;
                bool flag = false;
                foreach (int item in source)
                {
                    if (flag)
                    {
                        if (item < num)
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static int? Min(this IEnumerable<int?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                int? num = null;
                foreach (int? item in source)
                {
                    if (!num.HasValue || item < num)
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static long Min(this IEnumerable<long> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                bool flag = false;
                foreach (long item in source)
                {
                    if (flag)
                    {
                        if (item < num)
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static long? Min(this IEnumerable<long?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long? num = null;
                foreach (long? item in source)
                {
                    if (!num.HasValue || item < num)
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static float Min(this IEnumerable<float> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                float num = 0f;
                bool flag = false;
                foreach (float item in source)
                {
                    if (flag)
                    {
                        if (item < num || float.IsNaN(item))
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static float? Min(this IEnumerable<float?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                float? num = null;
                foreach (float? item in source)
                {
                    if (item.HasValue && (!num.HasValue || item < num || float.IsNaN(item.Value)))
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static double Min(this IEnumerable<double> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                bool flag = false;
                foreach (double item in source)
                {
                    if (flag)
                    {
                        if (item < num || double.IsNaN(item))
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static double? Min(this IEnumerable<double?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double? num = null;
                foreach (double? item in source)
                {
                    if (item.HasValue && (!num.HasValue || item < num || double.IsNaN(item.Value)))
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static decimal Min(this IEnumerable<decimal> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                decimal num = default(decimal);
                bool flag = false;
                foreach (decimal item in source)
                {
                    if (flag)
                    {
                        if (item < num)
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static decimal? Min(this IEnumerable<decimal?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                decimal? num = null;
                foreach (decimal? item in source)
                {
                    if (!num.HasValue || item < num)
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static TSource Min<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                Comparer<TSource> @default = Comparer<TSource>.Default;
                TSource val = default(TSource);
                if (val == null)
                {
                    foreach (TSource item in source)
                    {
                        if (item != null && (val == null || @default.Compare(item, val) < 0))
                        {
                            val = item;
                        }
                    }
    
                    return val;
                }
    
                bool flag = false;
                foreach (TSource item2 in source)
                {
                    if (flag)
                    {
                        if (@default.Compare(item2, val) < 0)
                        {
                            val = item2;
                        }
                    }
                    else
                    {
                        val = item2;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return val;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static int Min<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static int? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, int?> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static long Min<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static long? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, long?> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static float Min<TSource>(this IEnumerable<TSource> source, Func<TSource, float> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static float? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, float?> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static double Min<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static double? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, double?> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static decimal Min<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static decimal? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static TResult Min<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
            {
                return source.Select(selector).Min();
            }
    
            [__DynamicallyInvokable]
            public static int Max(this IEnumerable<int> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                int num = 0;
                bool flag = false;
                foreach (int item in source)
                {
                    if (flag)
                    {
                        if (item > num)
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static int? Max(this IEnumerable<int?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                int? num = null;
                foreach (int? item in source)
                {
                    if (!num.HasValue || item > num)
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static long Max(this IEnumerable<long> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                bool flag = false;
                foreach (long item in source)
                {
                    if (flag)
                    {
                        if (item > num)
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static long? Max(this IEnumerable<long?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long? num = null;
                foreach (long? item in source)
                {
                    if (!num.HasValue || item > num)
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static double Max(this IEnumerable<double> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                bool flag = false;
                foreach (double item in source)
                {
                    if (flag)
                    {
                        if (item > num || double.IsNaN(num))
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static double? Max(this IEnumerable<double?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double? num = null;
                foreach (double? item in source)
                {
                    if (item.HasValue && (!num.HasValue || item > num || double.IsNaN(num.Value)))
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static float Max(this IEnumerable<float> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                float num = 0f;
                bool flag = false;
                foreach (float item in source)
                {
                    if (flag)
                    {
                        if (item > num || double.IsNaN(num))
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static float? Max(this IEnumerable<float?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                float? num = null;
                foreach (float? item in source)
                {
                    if (item.HasValue && (!num.HasValue || item > num || float.IsNaN(num.Value)))
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static decimal Max(this IEnumerable<decimal> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                decimal num = default(decimal);
                bool flag = false;
                foreach (decimal item in source)
                {
                    if (flag)
                    {
                        if (item > num)
                        {
                            num = item;
                        }
                    }
                    else
                    {
                        num = item;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static decimal? Max(this IEnumerable<decimal?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                decimal? num = null;
                foreach (decimal? item in source)
                {
                    if (!num.HasValue || item > num)
                    {
                        num = item;
                    }
                }
    
                return num;
            }
    
            [__DynamicallyInvokable]
            public static TSource Max<TSource>(this IEnumerable<TSource> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                Comparer<TSource> @default = Comparer<TSource>.Default;
                TSource val = default(TSource);
                if (val == null)
                {
                    foreach (TSource item in source)
                    {
                        if (item != null && (val == null || @default.Compare(item, val) > 0))
                        {
                            val = item;
                        }
                    }
    
                    return val;
                }
    
                bool flag = false;
                foreach (TSource item2 in source)
                {
                    if (flag)
                    {
                        if (@default.Compare(item2, val) > 0)
                        {
                            val = item2;
                        }
                    }
                    else
                    {
                        val = item2;
                        flag = true;
                    }
                }
    
                if (flag)
                {
                    return val;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static int Max<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static int? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, int?> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static long Max<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static long? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, long?> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static float Max<TSource>(this IEnumerable<TSource> source, Func<TSource, float> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static float? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, float?> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static double Max<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static double? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, double?> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static decimal Max<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static decimal? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static TResult Max<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
            {
                return source.Select(selector).Max();
            }
    
            [__DynamicallyInvokable]
            public static double Average(this IEnumerable<int> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                long num2 = 0L;
                checked
                {
                    foreach (int item in source)
                    {
                        num += item;
                        num2++;
                    }
    
                    if (num2 > 0)
                    {
                        return (double)num / (double)num2;
                    }
    
                    throw Error.NoElements();
                }
            }
    
            [__DynamicallyInvokable]
            public static double? Average(this IEnumerable<int?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                long num2 = 0L;
                checked
                {
                    foreach (int? item in source)
                    {
                        if (item.HasValue)
                        {
                            num += item.GetValueOrDefault();
                            num2++;
                        }
                    }
    
                    if (num2 > 0)
                    {
                        return (double)num / (double)num2;
                    }
    
                    return null;
                }
            }
    
            [__DynamicallyInvokable]
            public static double Average(this IEnumerable<long> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                long num2 = 0L;
                checked
                {
                    foreach (long item in source)
                    {
                        num += item;
                        num2++;
                    }
    
                    if (num2 > 0)
                    {
                        return (double)num / (double)num2;
                    }
    
                    throw Error.NoElements();
                }
            }
    
            [__DynamicallyInvokable]
            public static double? Average(this IEnumerable<long?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                long num = 0L;
                long num2 = 0L;
                checked
                {
                    foreach (long? item in source)
                    {
                        if (item.HasValue)
                        {
                            num += item.GetValueOrDefault();
                            num2++;
                        }
                    }
    
                    if (num2 > 0)
                    {
                        return (double)num / (double)num2;
                    }
    
                    return null;
                }
            }
    
            [__DynamicallyInvokable]
            public static float Average(this IEnumerable<float> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                long num2 = 0L;
                foreach (float item in source)
                {
                    num += (double)item;
                    num2 = checked(num2 + 1);
                }
    
                if (num2 > 0)
                {
                    return (float)(num / (double)num2);
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static float? Average(this IEnumerable<float?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                long num2 = 0L;
                foreach (float? item in source)
                {
                    if (item.HasValue)
                    {
                        num += (double)item.GetValueOrDefault();
                        num2 = checked(num2 + 1);
                    }
                }
    
                if (num2 > 0)
                {
                    return (float)(num / (double)num2);
                }
    
                return null;
            }
    
            [__DynamicallyInvokable]
            public static double Average(this IEnumerable<double> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                long num2 = 0L;
                foreach (double item in source)
                {
                    num += item;
                    num2 = checked(num2 + 1);
                }
    
                if (num2 > 0)
                {
                    return num / (double)num2;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static double? Average(this IEnumerable<double?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                double num = 0.0;
                long num2 = 0L;
                foreach (double? item in source)
                {
                    if (item.HasValue)
                    {
                        num += item.GetValueOrDefault();
                        num2 = checked(num2 + 1);
                    }
                }
    
                if (num2 > 0)
                {
                    return num / (double)num2;
                }
    
                return null;
            }
    
            [__DynamicallyInvokable]
            public static decimal Average(this IEnumerable<decimal> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                decimal d = default(decimal);
                long num = 0L;
                foreach (decimal item in source)
                {
                    d += item;
                    num = checked(num + 1);
                }
    
                if (num > 0)
                {
                    return d / (decimal)num;
                }
    
                throw Error.NoElements();
            }
    
            [__DynamicallyInvokable]
            public static decimal? Average(this IEnumerable<decimal?> source)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                decimal d = default(decimal);
                long num = 0L;
                foreach (decimal? item in source)
                {
                    if (item.HasValue)
                    {
                        d += item.GetValueOrDefault();
                        num = checked(num + 1);
                    }
                }
    
                if (num > 0)
                {
                    return d / (decimal)num;
                }
    
                return null;
            }
    
            [__DynamicallyInvokable]
            public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static double? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int?> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static double? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, long?> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static float Average<TSource>(this IEnumerable<TSource> source, Func<TSource, float> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static float? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, float?> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static double? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, double?> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static decimal Average<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector)
            {
                return source.Select(selector).Average();
            }
    
            [__DynamicallyInvokable]
            public static decimal? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
            {
                return source.Select(selector).Average();
            }
    
            public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                AppendPrependIterator<TSource> appendPrependIterator = source as AppendPrependIterator<TSource>;
                if (appendPrependIterator != null)
                {
                    return appendPrependIterator.Append(element);
                }
    
                return new AppendPrepend1Iterator<TSource>(source, element, appending: true);
            }
    
            public static IEnumerable<TSource> Prepend<TSource>(this IEnumerable<TSource> source, TSource element)
            {
                if (source == null)
                {
                    throw Error.ArgumentNull("source");
                }
    
                AppendPrependIterator<TSource> appendPrependIterator = source as AppendPrependIterator<TSource>;
                if (appendPrependIterator != null)
                {
                    return appendPrependIterator.Prepend(element);
                }
    
                return new AppendPrepend1Iterator<TSource>(source, element, appending: false);
            }
        }
    }
  • 相关阅读:
    云原生生态周报 Vol. 16 | CNCF 归档 rkt,容器运行时“上古”之战老兵凋零
    Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍
    基于 K8s 做应用发布的工具那么多, 阿里为啥选择灰姑娘般的 Tekton ?
    Serverless 的喧哗与骚动(一)附Serverless行业发展回顾
    239. Sliding Window Maximum
    237. Delete Node in a Linked List
    146. LRU Cache
    140. Word Break II
    165. Compare Version Numbers
    258. Add Digits
  • 原文地址:https://www.cnblogs.com/xyh9039/p/13498682.html
Copyright © 2020-2023  润新知