Так ... что насчет этого не просто?
Вы хотите итератор. Вы хотите, чтобы он перебрал последний массив. Когда он доберется до конца этого массива, увеличьте его текущую позицию во втором по величине массиве и вернитесь к началу последнего массива.
psuedocode с использованием синтаксиса C # s yield return
:
foreach n1 in a1
foreach n2 in a2
foreach n3 in a3
yield return (n1, n2, n3)
РЕДАКТИРОВАТЬ: Если количество наборов варьируется, вы можете использовать некоторую форму рекурсии:
function next(list)
firstArray = list.first
iterator = iterator(list.rest)
if !iterator
foreach i in firstArray
yield return i
else
foreach i in firstArray
while (iterator.hasNext)
yield return (i, iterator.next)
Рассмотрим поведение при передаче списка длины 1, затем рассмотрим поведение списка длины 2 и убедитесь, что оно действительно работает.