var array = new string[] { "one", "two", "three" };
var result = Enumerable.Range(1, array.Length - 1)
.Select(i => new[] { array[i - 1], array[i] });
これは、タプルの代わりに配列を使用した@TrustMeソリューションです(サンプルを示すためだけに、私の答えを受け入れないでください):
IEnumerable<string> collection = new string[] { "one", "two", "three" };
var result = collection.Zip(collection.Skip(1), (x,y) => new [] { x, y });
ただし、インデックスによるアクセス (配列またはリスト) を使用しない場合、コレクションは2 回列挙されることに注意してください。
更新コレクションで機能し、シーケンスを一度だけ列挙する拡張メソッドを次に示します。
public static class Extensions
{
public static IEnumerable<T[]> GetOverlappingPairs<T>(
this IEnumerable<T> source)
{
var enumerator = source.GetEnumerator();
enumerator.MoveNext();
var first = enumerator.Current;
while (enumerator.MoveNext())
{
var second = enumerator.Current;
yield return new T[] { first, second };
first = second;
}
}
}
使用法:
var result = collection.GetOverlappingPairs();