Если у меня есть 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 Framework, которые делают то же самое и делают это не только для пар, но и для кортежей любого размера.
ИМХО, должен быть хороший способ сделать этот вид операций со скользящим окном.
Я использую C # 2.0 и могу представить, что в C # 3.0 (с LINQ) есть более (и более приятные) способы сделать это, но в первую очередь меня интересуют решения C # 2.0. Хотя я также буду признателен за решения C # 3.0.