using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
private static IEnumerable<T> Swap<T>(IEnumerable<T> source, int smallerIndex, int greaterIndex) {
using (IEnumerator<T> e = source.GetEnumerator()) {
IList<T> saved = new List<T>(greaterIndex-smallerIndex+1);
int index = 0;
while (e.MoveNext()) {
// If we're outside the swapped indexes, yield return the current element
if (index < smallerIndex || index > greaterIndex) {
index++;
yield return e.Current;
} else if (index == smallerIndex) {
var atSmaller = e.Current;
// Save all elements starting with the current one into a list;
// Continue until you find the last index, or exhaust the sequence.
while (index != greaterIndex && e.MoveNext()) {
saved.Add(e.Current);
index++;
}
// Make sure we're here because we got to the greaterIndex,
// not because we've exhausted the sequence
if (index == greaterIndex) {
// If we are OK, return the element at greaterIndex
yield return e.Current;
}
// Enumerate the saved items
for (int i = 0 ; i < saved.Count-1 ; i++) {
yield return saved[i];
}
// Finally, return the item at the smallerIndex
yield return atSmaller;
index++;
}
}
}
}
public static void Main()
{
var data = new[] {0,1,2,3,4,5,6};
foreach (var x in Swap(data, 2, 5)) {
Console.WriteLine(x);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICBwcml2YXRlIHN0YXRpYyBJRW51bWVyYWJsZTxUPiBTd2FwPFQ+KElFbnVtZXJhYmxlPFQ+IHNvdXJjZSwgaW50IHNtYWxsZXJJbmRleCwgaW50IGdyZWF0ZXJJbmRleCkgewp1c2luZyAoSUVudW1lcmF0b3I8VD4gZSA9IHNvdXJjZS5HZXRFbnVtZXJhdG9yKCkpIHsKICAgIElMaXN0PFQ+IHNhdmVkID0gbmV3IExpc3Q8VD4oZ3JlYXRlckluZGV4LXNtYWxsZXJJbmRleCsxKTsKICAgIGludCBpbmRleCA9IDA7CiAgICB3aGlsZSAoZS5Nb3ZlTmV4dCgpKSB7CiAgICAgICAgLy8gSWYgd2UncmUgb3V0c2lkZSB0aGUgc3dhcHBlZCBpbmRleGVzLCB5aWVsZCByZXR1cm4gdGhlIGN1cnJlbnQgZWxlbWVudAogICAgICAgIGlmIChpbmRleCA8IHNtYWxsZXJJbmRleCB8fCBpbmRleCA+IGdyZWF0ZXJJbmRleCkgewogICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICB5aWVsZCByZXR1cm4gZS5DdXJyZW50OwogICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gc21hbGxlckluZGV4KSB7CiAgICAgICAgICAgIHZhciBhdFNtYWxsZXIgPSBlLkN1cnJlbnQ7CiAgICAgICAgICAgIC8vIFNhdmUgYWxsIGVsZW1lbnRzIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgb25lIGludG8gYSBsaXN0OwogICAgICAgICAgICAvLyBDb250aW51ZSB1bnRpbCB5b3UgZmluZCB0aGUgbGFzdCBpbmRleCwgb3IgZXhoYXVzdCB0aGUgc2VxdWVuY2UuCiAgICAgICAgICAgIHdoaWxlIChpbmRleCAhPSBncmVhdGVySW5kZXggJiYgZS5Nb3ZlTmV4dCgpKSB7CiAgICAgICAgICAgICAgICBzYXZlZC5BZGQoZS5DdXJyZW50KTsKICAgICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIGhlcmUgYmVjYXVzZSB3ZSBnb3QgdG8gdGhlIGdyZWF0ZXJJbmRleCwKICAgICAgICAgICAgLy8gbm90IGJlY2F1c2Ugd2UndmUgZXhoYXVzdGVkIHRoZSBzZXF1ZW5jZQogICAgICAgICAgICBpZiAoaW5kZXggPT0gZ3JlYXRlckluZGV4KSB7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgT0ssIHJldHVybiB0aGUgZWxlbWVudCBhdCBncmVhdGVySW5kZXgKICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBlLkN1cnJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRW51bWVyYXRlIHRoZSBzYXZlZCBpdGVtcwogICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzYXZlZC5Db3VudC0xIDsgaSsrKSB7CiAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gc2F2ZWRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmluYWxseSwgcmV0dXJuIHRoZSBpdGVtIGF0IHRoZSBzbWFsbGVySW5kZXgKICAgICAgICAgICAgeWllbGQgcmV0dXJuIGF0U21hbGxlcjsKICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICB9CiAgICB9Cn0KICAgIH0KCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKICAgICAgICB2YXIgZGF0YSA9IG5ld1tdIHswLDEsMiwzLDQsNSw2fTsKICAgICAgICBmb3JlYWNoICh2YXIgeCBpbiBTd2FwKGRhdGEsIDIsIDUpKSB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHgpOwogICAgICAgIH0KCQkKCX0KfQ==