Wenn ich ein IEnumerable habe wie:Pair-wise Iteration in C# oder Schiebefenstern Enumerator
string[] items = new string[] { "a", "b", "c", "d" };
Ich möchte die alle Paare in einer Schleife durch aufeinander folgenden Artikel (Schiebefenster der Größe 2). Welche
("a","b"), ("b", "c"), ("c", "d")
Meine Lösung wurde ist diese
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)
}
sein würde, wenn ich diesen Code schrieb, fragte ich mich, ob es bereits Funktionen im .NET Framework, die das gleiche tun und tun es nicht nur für Paare, aber für Tupel jeder Größe. IMHO sollte es eine gute Möglichkeit, diese Art von Schiebefenster Operationen zu tun.
Ich benutze C# 2.0 und ich kann mir vorstellen, dass es mit C# 3.0 (mit LINQ) mehr (und schönere) Möglichkeiten gibt, aber ich bin hauptsächlich an C# 2.0-Lösungen interessiert. Allerdings werde ich auch C# 3.0-Lösungen zu schätzen wissen.
Dies scheint, als könnte es eine Menge Implementierung mit Jon Skeet "SmartEnumerator" teilen, die Ihnen sagt, ob ein Element das letzte in der Liste ist. http://msmvps.com/blogs/jon_skeet/archive/2007/07/27/smart-enumerations.aspx –
Als Referenz wird diese Funktion in F # 'Windowed' genannt: http://stackoverflow.com/questions/8874901/ist-es-gleich-zu-dem-f-seq-windowed-in-c – Benjol