次のような IEnumerable がある場合:
string[] items = new string[] { "a", "b", "c", "d" };
連続する項目のすべてのペア (サイズ 2 のスライディング ウィンドウ) をループしたいと思います。どれだろう
("a","b"), ("b", "c"), ("c", "d")
私の解決策はこれでした
public static IEnumerable<Pair<T, T>> Pairs(IEnumerable<T> enumerable) {
IEnumerator<T> e = enumerable.GetEnumerator(); e.MoveNext();
T current = e.Current;
while ( e.MoveNext() ) {
T next = e.Current;
yield return new Pair<T, T>(current, next);
current = next;
}
}
// used like this :
foreach (Pair<String,String> pair in IterTools<String>.Pairs(items)) {
System.Out.PrintLine("{0}, {1}", pair.First, pair.Second)
}
このコードを書いたとき、ペアだけでなく任意のサイズのタプルに対して同じことを行う関数が .NET フレームワークに既にあるのではないかと考えました。私見は、この種のスライディングウィンドウ操作を行うための良い方法があるはずです。
私は C# 2.0 を使用しており、C# 3.0 (LINQ を使用) を使用すると、これを行うためのより多くの (そしてより良い) 方法があると想像できますが、主に C# 2.0 ソリューションに興味があります。ただし、C# 3.0 ソリューションも高く評価します。