Вот как я это сделал в конце концов:
public static IEnumerable<T> AdNauseam<T>(this IEnumerable<T> i_list)
{
using(var etor = i_list.GetEnumerator())
{
while(true)
{
while(etor.MoveNext())
{
yield return etor.Current;
}
etor.Reset();
}
}
}
Использование:
var list = new[] {1, 2, 3}
var infinite = list.AdNauseam().Take(10);
Результат:
{1, 2, 3, 1, 2, 3, 1, 2, 3, 1}