Там - это проект под названием MoreLINQ с умными расширениями LINQ. Хотя в большинстве случаев код действительно прост благодаря простоте LINQ. Вы можете добавить его как пакет NuGet или как отдельные пакеты с исходным кодом, которые добавляют только нужные вам операторы.
Pairwise.cs реализует оператор, который может применять функцию к парам элементов:
int[] numbers = { 123, 456, 789 };
var result = numbers.Pairwise((a, b) => a + b);
Источник действительно прост - получить элемент и, если мы еще не достигли конца, получить другой элемент и применить функцию:
public static IEnumerable<TResult> Pairwise<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TSource, TResult> resultSelector)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (resultSelector == null) throw new ArgumentNullException(nameof(resultSelector));
return _();
IEnumerable<TResult> _()
{
using (var e = source.GetEnumerator())
{
if (!e.MoveNext())
yield break;
var previous = e.Current;
while (e.MoveNext())
{
yield return resultSelector(previous, e.Current);
previous = e.Current;
}
}
}
}
Единственный "трюк"использование локальной функции итератора с именем ... _
Вы можете использовать оператор Pairwise в качестве оптимизированного оператора Window только для 2 элементов. Есть еще один оператор Window , который может возвращать последовательности из N элементов.
Это выражение:
var x=Enumerable.Range(1,5).Window(3);
Создает следующие массивы:
{1,2,3}
{2,3,4}
{3,4,5}