通过反编译得到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: IEnumerable, IEnumerable, IEnumerator, 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 Clone(); public virtual void Dispose() { current = default(TSource); state = -1; } public IEnumerator GetEnumerator() { if (threadId == Thread.CurrentThread.ManagedThreadId && state == 0) { state = 1; return this; } Iteratoriterator = Clone(); iterator.state = 1; return iterator; } public abstract bool MoveNext(); public abstract IEnumerableSelect(Func selector); public abstract IEnumerableWhere(Func<TSource, bool> predicate); IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } void IEnumerator.Reset() { throw new NotImplementedException(); } } private class WhereEnumerableIterator: Iterator { private IEnumerable source; private Func<TSource, bool> predicate; private IEnumerator enumerator; public WhereEnumerableIterator(IEnumerablesource, Func<TSource, bool> predicate) { this.source = source; this.predicate = predicate; } public override Iterator Clone() { return new WhereEnumerableIterator(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 IEnumerableSelect(Func selector) { return new WhereSelectEnumerableIterator(source, predicate, selector); } public override IEnumerableWhere(Func<TSource, bool> predicate) { return new WhereEnumerableIterator(source, CombinePredicates(this.predicate, predicate)); } } private class WhereArrayIterator: Iterator { 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 Clone() { return new WhereArrayIterator(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 IEnumerableSelect(Func selector) { return new WhereSelectArrayIterator(source, predicate, selector); } public override IEnumerableWhere(Func<TSource, bool> predicate) { return new WhereArrayIterator(source, CombinePredicates(this.predicate, predicate)); } } private class WhereListIterator: Iterator { private List source; private Func<TSource, bool> predicate; private List.Enumerator enumerator; public WhereListIterator(Listsource, Func<TSource, bool> predicate) { this.source = source; this.predicate = predicate; } public override Iterator Clone() { return new WhereListIterator(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 IEnumerableSelect(Func selector) { return new WhereSelectListIterator(source, predicate, selector); } public override IEnumerableWhere(Func<TSource, bool> predicate) { return new WhereListIterator(source, CombinePredicates(this.predicate, predicate)); } } private class SelectEnumerableIterator: Iterator, IIListProvider, IEnumerable, IEnumerable { private readonly IEnumerable _source; private readonly Func _selector; private IEnumerator _enumerator; public SelectEnumerableIterator(IEnumerablesource, Func selector) { _source = source; _selector = selector; } public override Iterator Clone() { return new SelectEnumerableIterator(_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 IEnumerableSelect(Func selector) { return new SelectEnumerableIterator(_source, CombineSelectors(_selector, selector)); } public override IEnumerableWhere(Func<TResult, bool> predicate) { return new WhereEnumerableIterator(this, predicate); } public TResult[] ToArray() { LargeArrayBuilderlargeArrayBuilder = new LargeArrayBuilder(initialize: true); foreach (TSource item in _source) { largeArrayBuilder.Add(_selector(item)); } return largeArrayBuilder.ToArray(); } public List ToList() { Listlist = new List(); 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: Iterator { private IEnumerable source; private Func<TSource, bool> predicate; private Func selector; private IEnumerator enumerator; public WhereSelectEnumerableIterator(IEnumerablesource, Func<TSource, bool> predicate, Func selector) { this.source = source; this.predicate = predicate; this.selector = selector; } public override Iterator Clone() { return new WhereSelectEnumerableIterator(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 IEnumerableSelect(Func selector) { return new WhereSelectEnumerableIterator(source, predicate, CombineSelectors(this.selector, selector)); } public override IEnumerableWhere(Func<TResult, bool> predicate) { return new WhereEnumerableIterator(this, predicate); } } private class WhereSelectArrayIterator: Iterator { private TSource[] source; private Func<TSource, bool> predicate; private Func selector; private int index; public WhereSelectArrayIterator(TSource[] source, Func<TSource, bool> predicate, Func selector) { this.source = source; this.predicate = predicate; this.selector = selector; } public override Iterator Clone() { return new WhereSelectArrayIterator(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 IEnumerableSelect(Func selector) { return new WhereSelectArrayIterator(source, predicate, CombineSelectors(this.selector, selector)); } public override IEnumerableWhere(Func<TResult, bool> predicate) { return new WhereEnumerableIterator(this, predicate); } } private class WhereSelectListIterator: Iterator { private List source; private Func<TSource, bool> predicate; private Func selector; private List.Enumerator enumerator; public WhereSelectListIterator(Listsource, Func<TSource, bool> predicate, Func selector) { this.source = source; this.predicate = predicate; this.selector = selector; } public override Iterator Clone() { return new WhereSelectListIterator(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 IEnumerableSelect(Func selector) { return new WhereSelectListIterator(source, predicate, CombineSelectors(this.selector, selector)); } public override IEnumerableWhere(Func<TResult, bool> predicate) { return new WhereEnumerableIterator(this, predicate); } } private abstract class AppendPrependIterator: Iterator, IIListProvider, IEnumerable, IEnumerable { protected readonly IEnumerable _source; protected IEnumerator enumerator; protected AppendPrependIterator(IEnumerable source) { _source = source; } protected void GetSourceEnumerator() { enumerator = _source.GetEnumerator(); } public abstract AppendPrependIterator Append(TSource item); public abstract AppendPrependIterator 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 IEnumerableSelect(Func selector) { return new SelectEnumerableIterator(this, selector); } public override IEnumerableWhere(Func<TSource, bool> predicate) { return new WhereEnumerableIterator(this, predicate); } public abstract TSource[] ToArray(); public abstract List ToList(); public abstract int GetCount(bool onlyIfCheap); } private class AppendPrepend1Iterator: AppendPrependIterator { private readonly TSource _item; private readonly bool _appending; public AppendPrepend1Iterator(IEnumerablesource, TSource item, bool appending) : base(source) { _item = item; _appending = appending; } public override Iterator Clone() { return new AppendPrepend1Iterator(_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 Append(TSource item) { if (_appending) { return new AppendPrependN(_source, null, new SingleLinkedNode(_item).Add(item), 0, 2); } return new AppendPrependN(_source, new SingleLinkedNode(_item), new SingleLinkedNode(item), 1, 1); } public override AppendPrependIterator Prepend(TSource item) { if (_appending) { return new AppendPrependN(_source, new SingleLinkedNode(item), new SingleLinkedNode(_item), 1, 1); } return new AppendPrependN(_source, new SingleLinkedNode(_item).Add(item), null, 2, 0); } private TSource[] LazyToArray() { LargeArrayBuilderlargeArrayBuilder = new LargeArrayBuilder(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 ToList() { int count = GetCount(onlyIfCheap: true); Listlist = (count == -1) ? new List() : new List(count); if (!_appending) { list.Add(_item); } list.AddRange(_source); if (_appending) { list.Add(_item); } return list; } public override int GetCount(bool onlyIfCheap) { IIListProvideriIListProvider = _source as IIListProvider; if (iIListProvider != null) { int count = iIListProvider.GetCount(onlyIfCheap); if (count != -1) { return count + 1; } return -1; } if (onlyIfCheap && !(_source is ICollection)) { return -1; } return _source.Count() + 1; } } private class AppendPrependN: AppendPrependIterator { private readonly SingleLinkedNode _prepended; private readonly SingleLinkedNode _appended; private readonly int _prependCount; private readonly int _appendCount; private SingleLinkedNode _node; public AppendPrependN(IEnumerablesource, SingleLinkedNodeprepended, SingleLinkedNodeappended, int prependCount, int appendCount) : base(source) { _prepended = prepended; _appended = appended; _prependCount = prependCount; _appendCount = appendCount; } public override Iterator Clone() { return new AppendPrependN(_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 Append(TSource item) { SingleLinkedNodeappended = (_appended != null) ? _appended.Add(item) : new SingleLinkedNode(item); return new AppendPrependN(_source, _prepended, appended, _prependCount, _appendCount + 1); } public override AppendPrependIterator Prepend(TSource item) { SingleLinkedNodeprepended = (_prepended != null) ? _prepended.Add(item) : new SingleLinkedNode(item); return new AppendPrependN(_source, prepended, _appended, _prependCount + 1, _appendCount); } private TSource[] LazyToArray() { SparseArrayBuildersparseArrayBuilder = new SparseArrayBuilder(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 (SingleLinkedNodesingleLinkedNode = _prepended; singleLinkedNode != null; singleLinkedNode = singleLinkedNode.Linked) { array[num++] = singleLinkedNode.Item; } num = array.Length - 1; for (SingleLinkedNodesingleLinkedNode2 = _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 (SingleLinkedNodesingleLinkedNode = _prepended; singleLinkedNode != null; singleLinkedNode = singleLinkedNode.Linked) { array[num] = singleLinkedNode.Item; num++; } ICollectioncollection = _source as ICollection; if (collection != null) { collection.CopyTo(array, num); } else { foreach (TSource item in _source) { TSource val = array[num] = item; num++; } } num = array.Length; for (SingleLinkedNodesingleLinkedNode2 = _appended; singleLinkedNode2 != null; singleLinkedNode2 = singleLinkedNode2.Linked) { num--; array[num] = singleLinkedNode2.Item; } return array; } public override List ToList() { int count = GetCount(onlyIfCheap: true); Listlist = (count == -1) ? new List() : new List(count); for (SingleLinkedNodesingleLinkedNode = _prepended; singleLinkedNode != null; singleLinkedNode = singleLinkedNode.Linked) { list.Add(singleLinkedNode.Item); } list.AddRange(_source); if (_appended != null) { IEnumeratorenumerator = _appended.GetEnumerator(_appendCount); while (enumerator.MoveNext()) { list.Add(enumerator.Current); } } return list; } public override int GetCount(bool onlyIfCheap) { IIListProvideriIListProvider = _source as IIListProvider; if (iIListProvider != null) { int count = iIListProvider.GetCount(onlyIfCheap); if (count != -1) { return count + _appendCount + _prependCount; } return -1; } if (onlyIfCheap && !(_source is ICollection)) { return -1; } return _source.Count() + _appendCount + _prependCount; } } [__DynamicallyInvokable] public static IEnumerableWhere(this IEnumerablesource, Func<TSource, bool> predicate) { if (source == null) { throw Error.ArgumentNull("source"); } if (predicate == null) { throw Error.ArgumentNull("predicate"); } if (source is Iterator) { return ((Iterator)source).Where(predicate); } if (source is TSource[]) { return new WhereArrayIterator((TSource[])source, predicate); } if (source is List) { return new WhereListIterator((List)source, predicate); } return new WhereEnumerableIterator(source, predicate); } [__DynamicallyInvokable] public static IEnumerableWhere(this IEnumerablesource, 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 IEnumerableWhereIterator(IEnumerablesource, 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 IEnumerableSelect(this IEnumerablesource, Func selector) { if (source == null) { throw Error.ArgumentNull("source"); } if (selector == null) { throw Error.ArgumentNull("selector"); } if (source is Iterator) { return ((Iterator)source).Select(selector); } if (source is TSource[]) { return new WhereSelectArrayIterator((TSource[])source, null, selector); } if (source is List) { return new WhereSelectListIterator((List)source, null, selector); } return new WhereSelectEnumerableIterator(source, null, selector); } [__DynamicallyInvokable] public static IEnumerableSelect(this IEnumerablesource, 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 IEnumerableSelectIterator(IEnumerablesource, 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(Func<TSource, bool> predicate1, Func<TSource, bool> predicate2) { return (TSource x) => predicate1(x) && predicate2(x); } private static FuncCombineSelectors(Funcselector1, Func selector2) { return (TSource x) => selector2(selector1(x)); } [__DynamicallyInvokable] public static IEnumerableSelectMany(this IEnumerablesource, Func<TSource, IEnumerable> selector) { if (source == null) { throw Error.ArgumentNull("source"); } if (selector == null) { throw Error.ArgumentNull("selector"); } return SelectManyIterator(source, selector); } private static IEnumerableSelectManyIterator(IEnumerablesource, Func<TSource, IEnumerable> selector) { foreach (TSource item in source) { foreach (TResult item2 in selector(item)) { yield return item2; } } } [__DynamicallyInvokable] public static IEnumerableSelectMany(this IEnumerablesource, Func<TSource, int, IEnumerable> selector) { if (source == null) { throw Error.ArgumentNull("source"); } if (selector == null) { throw Error.ArgumentNull("selector"); } return SelectManyIterator(source, selector); } private static IEnumerableSelectManyIterator(IEnumerablesource, Func<TSource, int, IEnumerable> 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 IEnumerableSelectMany(this IEnumerablesource, Func<TSource, int, IEnumerable> collectionSelector, Func 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 IEnumerableSelectManyIterator(IEnumerablesource, Func<TSource, int, IEnumerable> collectionSelector, Func 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 IEnumerableSelectMany(this IEnumerablesource, Func<TSource, IEnumerable> collectionSelector, Func 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 IEnumerableSelectManyIterator(IEnumerablesource, Func<TSource, IEnumerable> collectionSelector, Func resultSelector) { foreach (TSource element in source) { foreach (TCollection item in collectionSelector(element)) { yield return resultSelector(element, item); } } } [__DynamicallyInvokable] public static IEnumerableTake(this IEnumerablesource, int count) { if (source == null) { throw Error.ArgumentNull("source"); } return TakeIterator(source, count); } private static IEnumerableTakeIterator(IEnumerablesource, 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 IEnumerableTakeWhile(this IEnumerablesource, Func<TSource, bool> predicate) { if (source == null) { throw Error.ArgumentNull("source"); } if (predicate == null) { throw Error.ArgumentNull("predicate"); } return TakeWhileIterator(source, predicate); } private static IEnumerableTakeWhileIterator(IEnumerablesource, Func<TSource, bool> predicate) { foreach (TSource item in source) { if (!predicate(item)) { break; } yield return item; } } [__DynamicallyInvokable] public static IEnumerableTakeWhile(this IEnumerablesource, 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 IEnumerableTakeWhileIterator(IEnumerablesource, 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 IEnumerableSkip(this IEnumerablesource, int count) { if (source == null) { throw Error.ArgumentNull("source"); } return SkipIterator(source, count); } private static IEnumerableSkipIterator(IEnumerablesource, int count) { using (IEnumeratore = source.GetEnumerator()) { while (count > 0 && e.MoveNext()) { count--; } if (count <= 0) { while (e.MoveNext()) { yield return e.Current; } } } } [__DynamicallyInvokable] public static IEnumerableSkipWhile(this IEnumerablesource, Func<TSource, bool> predicate) { if (source == null) { throw Error.ArgumentNull("source"); } if (predicate == null) { throw Error.ArgumentNull("predicate"); } return SkipWhileIterator(source, predicate); } private static IEnumerableSkipWhileIterator(IEnumerablesource, 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 IEnumerableSkipWhile(this IEnumerablesource, 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 IEnumerableSkipWhileIterator(IEnumerablesource, 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 IEnumerableJoin(this IEnumerableouter, IEnumerableinner, FuncouterKeySelector, FuncinnerKeySelector, Func 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 IEnumerableJoin(this IEnumerableouter, IEnumerableinner, FuncouterKeySelector, FuncinnerKeySelector, FuncresultSelector, IEqualityComparer 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 IEnumerableJoinIterator(IEnumerableouter, IEnumerableinner, FuncouterKeySelector, FuncinnerKeySelector, FuncresultSelector, IEqualityComparer comparer) { Lookuplookup = Lookup.CreateForJoin(inner, innerKeySelector, comparer); foreach (TOuter item in outer) { Lookup.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 IEnumerableGroupJoin(this IEnumerableouter, IEnumerableinner, FuncouterKeySelector, FuncinnerKeySelector, Func<TOuter, IEnumerable, 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 IEnumerableGroupJoin(this IEnumerableouter, IEnumerableinner, FuncouterKeySelector, FuncinnerKeySelector, Func<TOuter, IEnumerable, TResult> resultSelector, IEqualityComparer 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 IEnumerableGroupJoinIterator(IEnumerableouter, IEnumerableinner, FuncouterKeySelector, FuncinnerKeySelector, Func<TOuter, IEnumerable, TResult> resultSelector, IEqualityComparer comparer) { Lookuplookup = Lookup.CreateForJoin(inner, innerKeySelector, comparer); foreach (TOuter item in outer) { yield return resultSelector(item, lookup[outerKeySelector(item)]); } } [__DynamicallyInvokable] public static IOrderedEnumerableOrderBy(this IEnumerablesource, Func keySelector) { return new OrderedEnumerable(source, keySelector, null, descending: false); } [__DynamicallyInvokable] public static IOrderedEnumerableOrderBy(this IEnumerablesource, FunckeySelector, IComparer comparer) { return new OrderedEnumerable(source, keySelector, comparer, descending: false); } [__DynamicallyInvokable] public static IOrderedEnumerableOrderByDescending(this IEnumerablesource, Func keySelector) { return new OrderedEnumerable(source, keySelector, null, descending: true); } [__DynamicallyInvokable] public static IOrderedEnumerableOrderByDescending(this IEnumerablesource, FunckeySelector, IComparer comparer) { return new OrderedEnumerable(source, keySelector, comparer, descending: true); } [__DynamicallyInvokable] public static IOrderedEnumerableThenBy(this IOrderedEnumerablesource, Func keySelector) { if (source == null) { throw Error.ArgumentNull("source"); } return source.CreateOrderedEnumerable(keySelector, null, descending: false); } [__DynamicallyInvokable] public static IOrderedEnumerableThenBy(this IOrderedEnumerablesource, FunckeySelector, IComparer comparer) { if (source == null) { throw Error.ArgumentNull("source"); } return source.CreateOrderedEnumerable(keySelector, comparer, descending: false); } [__DynamicallyInvokable] public static IOrderedEnumerableThenByDescending(this IOrderedEnumerablesource, Func keySelector) { if (source == null) { throw Error.ArgumentNull("source"); } return source.CreateOrderedEnumerable(keySelector, null, descending: true); } [__DynamicallyInvokable] public static IOrderedEnumerableThenByDescending(this IOrderedEnumerablesource, FunckeySelector, IComparer comparer) { if (source == null) { throw Error.ArgumentNull("source"); } return source.CreateOrderedEnumerable(keySelector, comparer, descending: true); } [__DynamicallyInvokable] public static IEnumerable<IGrouping> GroupBy(this IEnumerablesource, Func keySelector) { return new GroupedEnumerable(source, keySelector, IdentityFunction.Instance, null); } [__DynamicallyInvokable] public static IEnumerable<IGrouping> GroupBy(this IEnumerablesource, FunckeySelector, IEqualityComparer comparer) { return new GroupedEnumerable(source, keySelector, IdentityFunction.Instance, comparer); } [__DynamicallyInvokable] public static IEnumerable<IGrouping> GroupBy(this IEnumerablesource, FunckeySelector, Func elementSelector) { return new GroupedEnumerable(source, keySelector, elementSelector, null); } [__DynamicallyInvokable] public static IEnumerable<IGrouping> GroupBy(this IEnumerablesource, FunckeySelector, FuncelementSelector, IEqualityComparer comparer) { return new GroupedEnumerable(source, keySelector, elementSelector, comparer); } [__DynamicallyInvokable] public static IEnumerableGroupBy(this IEnumerablesource, FunckeySelector, Func<TKey, IEnumerable, TResult> resultSelector) { return new GroupedEnumerable(source, keySelector, IdentityFunction.Instance, resultSelector, null); } [__DynamicallyInvokable] public static IEnumerableGroupBy(this IEnumerablesource, FunckeySelector, FuncelementSelector, Func<TKey, IEnumerable, TResult> resultSelector) { return new GroupedEnumerable(source, keySelector, elementSelector, resultSelector, null); } [__DynamicallyInvokable] public static IEnumerableGroupBy(this IEnumerablesource, FunckeySelector, Func<TKey, IEnumerable, TResult> resultSelector, IEqualityComparer comparer) { return new GroupedEnumerable(source, keySelector, IdentityFunction.Instance, resultSelector, comparer); } [__DynamicallyInvokable] public static IEnumerableGroupBy(this IEnumerablesource, FunckeySelector, FuncelementSelector, Func<TKey, IEnumerable, TResult> resultSelector, IEqualityComparer comparer) { return new GroupedEnumerable(source, keySelector, elementSelector, resultSelector, comparer); } [__DynamicallyInvokable] public static IEnumerableConcat(this IEnumerablefirst, IEnumerable second) { if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } return ConcatIterator(first, second); } private static IEnumerableConcatIterator(IEnumerablefirst, IEnumerable second) { foreach (TSource item in first) { yield return item; } foreach (TSource item2 in second) { yield return item2; } } [__DynamicallyInvokable] public static IEnumerableZip(this IEnumerablefirst, IEnumerablesecond, Func 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 IEnumerableZipIterator(IEnumerablefirst, IEnumerablesecond, Func resultSelector) { using (IEnumeratore3 = first.GetEnumerator()) { using (IEnumeratore2 = second.GetEnumerator()) { while (e3.MoveNext() && e2.MoveNext()) { yield return resultSelector(e3.Current, e2.Current); } } } } [__DynamicallyInvokable] public static IEnumerableDistinct(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } return DistinctIterator(source, null); } [__DynamicallyInvokable] public static IEnumerableDistinct(this IEnumerablesource, IEqualityComparer comparer) { if (source == null) { throw Error.ArgumentNull("source"); } return DistinctIterator(source, comparer); } private static IEnumerableDistinctIterator(IEnumerablesource, IEqualityComparer comparer) { Setset = new Set(comparer); foreach (TSource item in source) { if (set.Add(item)) { yield return item; } } } [__DynamicallyInvokable] public static IEnumerableUnion(this IEnumerablefirst, IEnumerable second) { if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } return UnionIterator(first, second, null); } [__DynamicallyInvokable] public static IEnumerableUnion(this IEnumerablefirst, IEnumerablesecond, IEqualityComparer comparer) { if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } return UnionIterator(first, second, comparer); } private static IEnumerableUnionIterator(IEnumerablefirst, IEnumerablesecond, IEqualityComparer comparer) { Setset = new Set(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 IEnumerableIntersect(this IEnumerablefirst, IEnumerable second) { if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } return IntersectIterator(first, second, null); } [__DynamicallyInvokable] public static IEnumerableIntersect(this IEnumerablefirst, IEnumerablesecond, IEqualityComparer comparer) { if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } return IntersectIterator(first, second, comparer); } private static IEnumerableIntersectIterator(IEnumerablefirst, IEnumerablesecond, IEqualityComparer comparer) { Setset = new Set(comparer); foreach (TSource item in second) { set.Add(item); } foreach (TSource item2 in first) { if (set.Remove(item2)) { yield return item2; } } } [__DynamicallyInvokable] public static IEnumerableExcept(this IEnumerablefirst, IEnumerable second) { if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } return ExceptIterator(first, second, null); } [__DynamicallyInvokable] public static IEnumerableExcept(this IEnumerablefirst, IEnumerablesecond, IEqualityComparer comparer) { if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } return ExceptIterator(first, second, comparer); } private static IEnumerableExceptIterator(IEnumerablefirst, IEnumerablesecond, IEqualityComparer comparer) { Setset = new Set(comparer); foreach (TSource item in second) { set.Add(item); } foreach (TSource item2 in first) { if (set.Add(item2)) { yield return item2; } } } [__DynamicallyInvokable] public static IEnumerableReverse(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } return ReverseIterator(source); } private static IEnumerableReverseIterator(IEnumerable source) { Bufferbuffer = new Buffer(source); for (int i = buffer.count - 1; i >= 0; i--) { yield return buffer.items[i]; } } [__DynamicallyInvokable] public static bool SequenceEqual(this IEnumerablefirst, IEnumerable second) { return first.SequenceEqual(second, null); } [__DynamicallyInvokable] public static bool SequenceEqual(this IEnumerablefirst, IEnumerablesecond, IEqualityComparer comparer) { if (comparer == null) { comparer = EqualityComparer.Default; } if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } using (IEnumeratorenumerator = first.GetEnumerator()) { using (IEnumeratorenumerator2 = 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 IEnumerableAsEnumerable(this IEnumerable source) { return source; } [__DynamicallyInvokable] public static TSource[] ToArray(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } return new Buffer(source).ToArray(); } [__DynamicallyInvokable] public static ListToList(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } return new List(source); } [__DynamicallyInvokable] public static DictionaryToDictionary(this IEnumerablesource, Func keySelector) { return source.ToDictionary(keySelector, IdentityFunction.Instance, null); } [__DynamicallyInvokable] public static DictionaryToDictionary(this IEnumerablesource, FunckeySelector, IEqualityComparer comparer) { return source.ToDictionary(keySelector, IdentityFunction.Instance, comparer); } [__DynamicallyInvokable] public static DictionaryToDictionary(this IEnumerablesource, FunckeySelector, Func elementSelector) { return source.ToDictionary(keySelector, elementSelector, null); } [__DynamicallyInvokable] public static DictionaryToDictionary(this IEnumerablesource, FunckeySelector, FuncelementSelector, IEqualityComparer comparer) { if (source == null) { throw Error.ArgumentNull("source"); } if (keySelector == null) { throw Error.ArgumentNull("keySelector"); } if (elementSelector == null) { throw Error.ArgumentNull("elementSelector"); } Dictionarydictionary = new Dictionary(comparer); foreach (TSource item in source) { dictionary.Add(keySelector(item), elementSelector(item)); } return dictionary; } [__DynamicallyInvokable] public static ILookupToLookup(this IEnumerablesource, Func keySelector) { return Lookup.Create(source, keySelector, IdentityFunction.Instance, null); } [__DynamicallyInvokable] public static ILookupToLookup(this IEnumerablesource, FunckeySelector, IEqualityComparer comparer) { return Lookup.Create(source, keySelector, IdentityFunction.Instance, comparer); } [__DynamicallyInvokable] public static ILookupToLookup(this IEnumerablesource, FunckeySelector, Func elementSelector) { return Lookup.Create(source, keySelector, elementSelector, null); } [__DynamicallyInvokable] public static ILookupToLookup(this IEnumerablesource, FunckeySelector, FuncelementSelector, IEqualityComparer comparer) { return Lookup.Create(source, keySelector, elementSelector, comparer); } public static HashSetToHashSet(this IEnumerable source) { return source.ToHashSet(null); } public static HashSetToHashSet(this IEnumerablesource, IEqualityComparer comparer) { if (source == null) { throw Error.ArgumentNull("source"); } return new HashSet(source, comparer); } [__DynamicallyInvokable] public static IEnumerableDefaultIfEmpty(this IEnumerable source) { return source.DefaultIfEmpty(default(TSource)); } [__DynamicallyInvokable] public static IEnumerableDefaultIfEmpty(this IEnumerable source, TSource defaultValue) { if (source == null) { throw Error.ArgumentNull("source"); } return DefaultIfEmptyIterator(source, defaultValue); } private static IEnumerableDefaultIfEmptyIterator(IEnumerable source, TSource defaultValue) { using (IEnumeratore = source.GetEnumerator()) { if (e.MoveNext()) { do { yield return e.Current; } while (e.MoveNext()); } else { yield return defaultValue; } } } [__DynamicallyInvokable] public static IEnumerableOfType(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } return OfTypeIterator(source); } private static IEnumerableOfTypeIterator(IEnumerable source) { foreach (object item in source) { if (item is TResult) { yield return (TResult)item; } } } [__DynamicallyInvokable] public static IEnumerableCast(this IEnumerable source) { IEnumerableenumerable = source as IEnumerable; if (enumerable != null) { return enumerable; } if (source == null) { throw Error.ArgumentNull("source"); } return CastIterator(source); } private static IEnumerableCastIterator(IEnumerable source) { foreach (object item in source) { yield return (TResult)item; } } [__DynamicallyInvokable] public static TSource First(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } IListlist = source as IList; if (list != null) { if (list.Count > 0) { return list[0]; } } else { using (IEnumeratorenumerator = source.GetEnumerator()) { if (enumerator.MoveNext()) { return enumerator.Current; } } } throw Error.NoElements(); } [__DynamicallyInvokable] public static TSource First(this IEnumerablesource, 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } IListlist = source as IList; if (list != null) { if (list.Count > 0) { return list[0]; } } else { using (IEnumeratorenumerator = source.GetEnumerator()) { if (enumerator.MoveNext()) { return enumerator.Current; } } } return default(TSource); } [__DynamicallyInvokable] public static TSource FirstOrDefault(this IEnumerablesource, 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } IListlist = source as IList; if (list != null) { int count = list.Count; if (count > 0) { return list[count - 1]; } } else { using (IEnumeratorenumerator = source.GetEnumerator()) { if (enumerator.MoveNext()) { TSource current; do { current = enumerator.Current; } while (enumerator.MoveNext()); return current; } } } throw Error.NoElements(); } [__DynamicallyInvokable] public static TSource Last(this IEnumerablesource, 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } IListlist = source as IList; if (list != null) { int count = list.Count; if (count > 0) { return list[count - 1]; } } else { using (IEnumeratorenumerator = source.GetEnumerator()) { if (enumerator.MoveNext()) { TSource current; do { current = enumerator.Current; } while (enumerator.MoveNext()); return current; } } } return default(TSource); } [__DynamicallyInvokable] public static TSource LastOrDefault(this IEnumerablesource, 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } IListlist = source as IList; if (list != null) { switch (list.Count) { case 0: throw Error.NoElements(); case 1: return list[0]; } } else { using (IEnumeratorenumerator = 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(this IEnumerablesource, 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } IListlist = source as IList; if (list != null) { switch (list.Count) { case 0: return default(TSource); case 1: return list[0]; } } else { using (IEnumeratorenumerator = 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(this IEnumerablesource, 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(this IEnumerablesource, int index) { if (source == null) { throw Error.ArgumentNull("source"); } IListlist = source as IList; if (list != null) { return list[index]; } if (index < 0) { throw Error.ArgumentOutOfRange("index"); } using (IEnumeratorenumerator = source.GetEnumerator()) { while (enumerator.MoveNext()) { if (index == 0) { return enumerator.Current; } index--; } throw Error.ArgumentOutOfRange("index"); } } [__DynamicallyInvokable] public static TSource ElementAtOrDefault(this IEnumerablesource, int index) { if (source == null) { throw Error.ArgumentNull("source"); } if (index >= 0) { IListlist = source as IList; if (list != null) { if (index < list.Count) { return list[index]; } } else { using (IEnumeratorenumerator = 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 IEnumerableRepeat(TResult element, int count) { if (count < 0) { throw Error.ArgumentOutOfRange("count"); } return RepeatIterator(element, count); } private static IEnumerableRepeatIterator(TResult element, int count) { for (int i = 0; i < count; i++) { yield return element; } } [__DynamicallyInvokable] public static IEnumerableEmpty() { return EmptyEnumerable.Instance; } [__DynamicallyInvokable] public static bool Any(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } using (IEnumeratorenumerator = source.GetEnumerator()) { if (enumerator.MoveNext()) { return true; } } return false; } [__DynamicallyInvokable] public static bool Any(this IEnumerablesource, 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(this IEnumerablesource, 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } ICollectioncollection = source as ICollection; if (collection != null) { return collection.Count; } ICollection collection2 = source as ICollection; if (collection2 != null) { return collection2.Count; } int num = 0; using (IEnumeratorenumerator = source.GetEnumerator()) { while (enumerator.MoveNext()) { num = checked(num + 1); } return num; } } [__DynamicallyInvokable] public static int Count(this IEnumerablesource, 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } long num = 0L; using (IEnumeratorenumerator = source.GetEnumerator()) { while (enumerator.MoveNext()) { num = checked(num + 1); } return num; } } [__DynamicallyInvokable] public static long LongCount(this IEnumerablesource, 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(this IEnumerable source, TSource value) { return (source as ICollection)?.Contains(value) ?? source.Contains(value, null); } [__DynamicallyInvokable] public static bool Contains(this IEnumerablesource, TSource value, IEqualityComparer comparer) { if (comparer == null) { comparer = EqualityComparer.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(this IEnumerablesource, Func func) { if (source == null) { throw Error.ArgumentNull("source"); } if (func == null) { throw Error.ArgumentNull("func"); } using (IEnumeratorenumerator = 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(this IEnumerablesource, TAccumulate seed, Func 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(this IEnumerablesource, TAccumulate seed, Funcfunc, Func 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(this IEnumerablesource, Func<TSource, int> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static int? Sum(this IEnumerablesource, Func<TSource, int?> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static long Sum(this IEnumerablesource, Func<TSource, long> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static long? Sum(this IEnumerablesource, Func<TSource, long?> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static float Sum(this IEnumerablesource, Func<TSource, float> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static float? Sum(this IEnumerablesource, Func<TSource, float?> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static double Sum(this IEnumerablesource, Func<TSource, double> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static double? Sum(this IEnumerablesource, Func<TSource, double?> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static decimal Sum(this IEnumerablesource, Func<TSource, decimal> selector) { return source.Select(selector).Sum(); } [__DynamicallyInvokable] public static decimal? Sum(this IEnumerablesource, 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } Comparer@default = Comparer.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(this IEnumerablesource, Func<TSource, int> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static int? Min(this IEnumerablesource, Func<TSource, int?> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static long Min(this IEnumerablesource, Func<TSource, long> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static long? Min(this IEnumerablesource, Func<TSource, long?> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static float Min(this IEnumerablesource, Func<TSource, float> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static float? Min(this IEnumerablesource, Func<TSource, float?> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static double Min(this IEnumerablesource, Func<TSource, double> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static double? Min(this IEnumerablesource, Func<TSource, double?> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static decimal Min(this IEnumerablesource, Func<TSource, decimal> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static decimal? Min(this IEnumerablesource, Func<TSource, decimal?> selector) { return source.Select(selector).Min(); } [__DynamicallyInvokable] public static TResult Min(this IEnumerablesource, Func 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(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } Comparer@default = Comparer.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(this IEnumerablesource, Func<TSource, int> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static int? Max(this IEnumerablesource, Func<TSource, int?> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static long Max(this IEnumerablesource, Func<TSource, long> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static long? Max(this IEnumerablesource, Func<TSource, long?> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static float Max(this IEnumerablesource, Func<TSource, float> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static float? Max(this IEnumerablesource, Func<TSource, float?> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static double Max(this IEnumerablesource, Func<TSource, double> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static double? Max(this IEnumerablesource, Func<TSource, double?> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static decimal Max(this IEnumerablesource, Func<TSource, decimal> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static decimal? Max(this IEnumerablesource, Func<TSource, decimal?> selector) { return source.Select(selector).Max(); } [__DynamicallyInvokable] public static TResult Max(this IEnumerablesource, Func 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(this IEnumerablesource, Func<TSource, int> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static double? Average(this IEnumerablesource, Func<TSource, int?> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static double Average(this IEnumerablesource, Func<TSource, long> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static double? Average(this IEnumerablesource, Func<TSource, long?> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static float Average(this IEnumerablesource, Func<TSource, float> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static float? Average(this IEnumerablesource, Func<TSource, float?> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static double Average(this IEnumerablesource, Func<TSource, double> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static double? Average(this IEnumerablesource, Func<TSource, double?> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static decimal Average(this IEnumerablesource, Func<TSource, decimal> selector) { return source.Select(selector).Average(); } [__DynamicallyInvokable] public static decimal? Average(this IEnumerablesource, Func<TSource, decimal?> selector) { return source.Select(selector).Average(); } public static IEnumerableAppend(this IEnumerable source, TSource element) { if (source == null) { throw Error.ArgumentNull("source"); } AppendPrependIteratorappendPrependIterator = source as AppendPrependIterator; if (appendPrependIterator != null) { return appendPrependIterator.Append(element); } return new AppendPrepend1Iterator(source, element, appending: true); } public static IEnumerablePrepend(this IEnumerable source, TSource element) { if (source == null) { throw Error.ArgumentNull("source"); } AppendPrependIteratorappendPrependIterator = source as AppendPrependIterator; if (appendPrependIterator != null) { return appendPrependIterator.Prepend(element); } return new AppendPrepend1Iterator(source, element, appending: false); } } }