Iteração pareada em C # ou enumerador de janela deslizante

Se eu tiver um IEnumerable como:

string[] items = new string[] { "a", "b", "c", "d" };

Gostaria de percorrer todos os pares de itens consecutivos (janela deslizante de tamanho 2). Qual seri

("a","b"), ("b", "c"), ("c", "d")

Minha solução foi essa é

    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)
 }

Quando escrevi esse código, me perguntei se já existem funções no .NET framework que fazem a mesma coisa e não apenas para pares, mas para tuplas de qualquer tamanho. IMHO deve haver uma boa maneira de fazer esse tipo de operação de janela deslizante.

Eu uso o C # 2.0 e posso imaginar que, com o C # 3.0 (w / LINQ), existem mais maneiras (e mais agradáveis) de fazer isso, mas estou principalmente interessado em soluções em C # 2.0. No entanto, também aprecio as soluções C # 3.0.

questionAnswers(12)

yourAnswerToTheQuestion