Если у меня есть IEnumerable как:попарной итерация в C# или скользящего окно перечислитель
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 (w/LINQ) есть больше (и более приятных) способов сделать это, но меня в первую очередь интересуют решения C# 2.0. Хотя, я также буду признателен за решения C# 3.0.
Это похоже на то, что он может поделиться большой реализацией с помощью «SmartEnumerator» Джона Скита, который сообщает вам, является ли элемент последним в списке. http://msmvps.com/blogs/jon_skeet/archive/2007/07/27/smart-enumerations.aspx –
Для справки эта функция называется «Оконная» в F #: http://stackoverflow.com/questions/8874901/is-there-a-a-an-a-f-seq-windowed-in-c – Benjol