The easiest way is to write a function that simply returns pairs.
Sort of:
IEnumerable<Tuple<T,T>> Pairs<T>(IEnumerable<T> items) { T first = default(T); bool hasFirst = false; foreach(T item in items) { if (hasFirst) yield return Tuple.Create(first, item); else first = item; hasFirst = !hasFirst; } }
Aggregate is likely to be one single line approach. This is purely entertainment code due to the amount of garbage created in the path, but mutable objects are not used.
IEnumerable<Tuple<T,T>> Pairs<T>(IEnumerable<T> collection) { return collection .Aggregate( Tuple.Create(false, default(T), Enumerable.Empty<Tuple<T,T>>()), (accumulate, item)=> !accumulate.Item1 ? Tuple.Create(true, item, accumulate.Item3) : Tuple.Create(false, default(T), accumulate.Item3.Concat( Enumerable.Repeat(Tuple.Create(accumulate.Item2, item), 1))), accumulate => accumulate.Item3); }
Zip odd and even elements ( index %2 ==/!= 0 ) is two-line. Note that iterating the original collection twice.
IEnumerable<Tuple<T,T>> Pairs<T>(IEnumerable<T> collection) { return collection .Where((item, index)=>index %2 == 0) .Zip(collection.Where((item, index)=>index %2 != 0), (first,second)=> Tuple.Create(first,second)); }
source share