56 votes

Itération en paires en C ou renumérateur de fenêtre coulissante

Si j'ai un IEnumerable comme:

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

Je voudrais en boucle par toutes les paires d'éléments consécutifs (fenêtre glissante de taille 2). Ce qui serait

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

Ma solution a été est-ce

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

Quand j'ai écrit ce code, je me demandais s'il existe déjà des fonctions dans l' .NET framework qui font la même chose et il n'est pas juste pour les paires, mais pour n'importe quel taille des n-uplets. À mon humble avis, il devrait y avoir une façon agréable de faire ce genre de fenêtre coulissante opérations.

J'utilise C# 2.0 et je peux imaginer qu'avec C# 3.0 (w/ LINQ) il n'y a plus (et plus agréable) façons de le faire, mais je suis principalement intéressé en C# 2.0 solutions. Cependant, j'apprécie aussi de C# 3.0 solutions.

59voto

Ian Mercer Points 19271

Dans .NET 4 cela devient encore plus facile:-

44voto

dahlbyk Points 24897

Plutôt que d'exiger un type de tuple (paire), pourquoi ne pas simplement accepter un sélecteur :

Ce qui vous permet de sauter l'objet intermédiaire si vous voulez :

Ou vous pouvez utiliser un type anonyme :

12voto

bradgonesurfing Points 8600

La façon la plus simple est d'utiliser ReactiveExtensions

et vous faire une méthode d'extension pour kit bash ce ensemble

2voto

Richard Points 54016

Élargissement de la réponse précédente pour éviter l'approche O(n<sup>2</sup>) en utilisant explicitement l'itérateur adopté :

Pour le Cm2, avant les méthodes d'extension, retirez le « ceci » du paramètre d'entrée et appelez comme méthode statique.

1voto

mquander Points 32650

Solution C3.0 (désolé:)

Ce n'est pas le plus performant au monde, mais c'est agréable à regarder.

Vraiment, la seule chose qui en fait une solution C 3.0 est le . Skip.Take construction, donc si vous venez de changer cela à l'ajout des éléments dans cette gamme à une liste à la place, il devrait être d'or pour 2.0. Cela dit, il n'est toujours pas performant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X