通过反编译得到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);
}
}
}
赞 (0)
