> Zip <TOutItem, TFirstItem>( BuiltInEnumerable <TFirstItem> first, RangeEnumerable second, Func <TFirstItem, int, TOutItem> resultSelector ) { var firstBridged = Bridge(first, nameof(first)); if (second.IsDefaultValue()) { throw CommonImplementation.Uninitialized(nameof(second)); } if (resultSelector == null) { throw CommonImplementation.ArgumentNull(nameof(resultSelector)); } return (CommonImplementation.ZipImpl < TOutItem, TFirstItem, int, BuiltInEnumerable <TFirstItem>, BuiltInEnumerator <TFirstItem>, RangeEnumerable, RangeEnumerator >(RefLocal(firstBridged), ref second, resultSelector)); }
// RangeEnumerable public double Average(RangeEnumerable source) { if (source.IsDefaultValue()) { throw CommonImplementation.Uninitialized(nameof(source)); } if (source.InnerCount == 0) { throw CommonImplementation.SequenceEmpty(); } // 4 5 6 // ^ // 1 2 3 4 // ^ var leftIx = source.InnerCount / 2; double left = source.Start + leftIx; if (source.InnerCount % 2 == 0) { // even double right = left + 1; return((left + right) / 2.0); } else { // odd return(left); } }
// RangeEnumerable public bool SequenceEqual( PlaceholderEnumerable <int> first, RangeEnumerable second ) { return (CommonImplementation.SequenceEqual < int, PlaceholderEnumerable <int>, PlaceholderEnumerator <int>, RangeEnumerable, RangeEnumerator >(RefParam(first), ref second, null)); }
public bool SequenceEqual( ReverseRangeEnumerable first, RangeEnumerable second ) { return (CommonImplementation.SequenceEqual < int, ReverseRangeEnumerable, ReverseRangeEnumerator, RangeEnumerable, RangeEnumerator >(ref first, ref second, null)); }
public bool SequenceEqual( ReverseRangeEnumerable first, RangeEnumerable second, IEqualityComparer <int> comparer ) { return (CommonImplementation.SequenceEqual < int, ReverseRangeEnumerable, ReverseRangeEnumerator, RangeEnumerable, RangeEnumerator >(ref first, ref second, comparer)); }
// RangeEnumerable public int Sum(RangeEnumerable source) { if (source.IsDefaultValue()) { throw CommonImplementation.Uninitialized(nameof(source)); } if (source.InnerCount == 0) { return(0); } long first = source.Start; long last = first + source.InnerCount - 1; var length = source.InnerCount; // https://math.stackexchange.com/a/50487/111 // sum of range [a, b] = (a + b) / 2 * ((b - a) + 1) // count = b - a + 1 // 2 * sum = (a + b) * ((b - a) + 1) // 0 1 2 3 // a = 0 // b = 3 // (a + b) = 3 // (b - a) + 1 = 4 // (a + b) * ((b - a) + 1) = 12 // sum = 12 / 2 = 6 // 1 2 3 4 5 // a = 1 // b = 5 // (a + b) = 6 // (b - a) + 1 = 5 // (a + b) * ((b - a) + 1) = 30 // sum = 30 / 2 = 15 long twiceSum = (first + last); twiceSum *= length; long ret = twiceSum / 2; checked { return((int)ret); } }
public ConcatEnumerable <int, ReverseRangeEnumerable, ReverseRangeEnumerator, RangeEnumerable, RangeEnumerator> Concat( ReverseRangeEnumerable first, RangeEnumerable second ) { return (CommonImplementation.Concat < int, ReverseRangeEnumerable, ReverseRangeEnumerator, RangeEnumerable, RangeEnumerator >( ref first, ref second )); }
// RangeEnumerable public ConcatEnumerable <int, PlaceholderEnumerable <int>, PlaceholderEnumerator <int>, RangeEnumerable, RangeEnumerator> Concat( PlaceholderEnumerable <int> first, RangeEnumerable second ) { return (CommonImplementation.Concat < int, PlaceholderEnumerable <int>, PlaceholderEnumerator <int>, RangeEnumerable, RangeEnumerator >( RefParam(first), ref second )); }
> Except( BuiltInEnumerable <int> first, RangeEnumerable second ) { var firstBridge = Bridge(first, nameof(first)); if (second.IsDefaultValue()) { throw CommonImplementation.Uninitialized(nameof(second)); } return(CommonImplementation.ExceptImpl < int, BuiltInEnumerable <int>, BuiltInEnumerator <int>, RangeEnumerable, RangeEnumerator >(RefLocal(firstBridge), ref second)); }
> Join <TOutItem, TJoinKeyItem, TJoinLeftItem>( BuiltInEnumerable <TJoinLeftItem> outer, RangeEnumerable inner, Func <TJoinLeftItem, TJoinKeyItem> outerKeySelector, Func <int, TJoinKeyItem> innerKeySelector, Func <TJoinLeftItem, int, TOutItem> resultSelector, IEqualityComparer <TJoinKeyItem> comparer ) { var outerBridge = Bridge(outer, nameof(outer)); if (inner.IsDefaultValue()) { throw CommonImplementation.Uninitialized(nameof(inner)); } if (outerKeySelector == null) { throw CommonImplementation.ArgumentNull(nameof(outerKeySelector)); } if (innerKeySelector == null) { throw CommonImplementation.ArgumentNull(nameof(innerKeySelector)); } if (resultSelector == null) { throw CommonImplementation.ArgumentNull(nameof(resultSelector)); } return (CommonImplementation.JoinImpl < TOutItem, TJoinKeyItem, TJoinLeftItem, BuiltInEnumerable <TJoinLeftItem>, BuiltInEnumerator <TJoinLeftItem>, int, RangeEnumerable, RangeEnumerator >(RefLocal(outerBridge), ref inner, outerKeySelector, innerKeySelector, resultSelector, comparer)); }
> Intersect( BuiltInEnumerable <int> first, RangeEnumerable second, IEqualityComparer <int> comparer ) { var firstBridge = Bridge(first, nameof(first)); if (second.IsDefaultValue()) { throw CommonImplementation.Uninitialized(nameof(second)); } return(CommonImplementation.IntersectImpl < int, BuiltInEnumerable <int>, BuiltInEnumerator <int>, RangeEnumerable, RangeEnumerator >(RefLocal(firstBridge), ref second, comparer)); }
> GroupJoin <TResult, TGroupJoinKey, TOuter>( BuiltInEnumerable <TOuter> outer, RangeEnumerable inner, Func <TOuter, TGroupJoinKey> outerKeySelector, Func <int, TGroupJoinKey> innerKeySelector, Func <TOuter, GroupedEnumerable <TGroupJoinKey, int>, TResult> resultSelector, IEqualityComparer <TGroupJoinKey> comparer ) { var outerBridge = Bridge(outer, nameof(outer)); if (inner.IsDefaultValue()) { throw CommonImplementation.Uninitialized(nameof(inner)); } if (outerKeySelector == null) { throw CommonImplementation.ArgumentNull(nameof(outerKeySelector)); } if (innerKeySelector == null) { throw CommonImplementation.ArgumentNull(nameof(innerKeySelector)); } if (resultSelector == null) { throw CommonImplementation.ArgumentNull(nameof(resultSelector)); } return (CommonImplementation.GroupJoinImpl < TResult, TGroupJoinKey, TOuter, BuiltInEnumerable <TOuter>, BuiltInEnumerator <TOuter>, int, RangeEnumerable, RangeEnumerator >(RefLocal(outerBridge), ref inner, outerKeySelector, innerKeySelector, resultSelector, comparer)); }
public static System.Collections.Generic.LinkedList <int> LinkedList(RangeEnumerable second) => LinkedListImpl <int, RangeEnumerable, RangeEnumerator>(ref second);
public static System.Collections.Generic.Stack <int> Stack(RangeEnumerable second) => StackImpl <int, RangeEnumerable, RangeEnumerator>(ref second);
public static System.Collections.Generic.Queue <int> Queue(RangeEnumerable second) => QueueImpl <int, RangeEnumerable, RangeEnumerator>(ref second);