Рекурсивный перебор элементов массива любой размерности - C#
Формулировка задачи:
Так долго вожусь и все равно ничего :
Очень уродливый код и безысходность , спасайте.
public static void _ForEach<T>(this Array a , Func<T,T> act){
int[] indices = new int[a.Rank];
a._For(i =>a.SetValue( act((T)a.GetValue(i)) , i),ref indices , 0);
}
public static void _For(this Array a , Action<int[]> act ,ref int[] indices, int j = 0 ){
act(indices);
try{indices[j]++;} catch(IndexOutOfRangeException) { //Этот алгоритм пропускает 1 и 1 2 и 2 ,я это восполняю
for (UInt32 i = 0; i < a.Rank; i++) {
for ( UInt32 i_ = 0; i_ < indices.Rank ;i_++) indices[i_] = (int)i;
act(indices);
}
return;
}
if (indices[j] < a.GetLength(j)-1) a._For(act,ref indices,j);
else a._For(act,ref indices,++j);
}Решение задачи: «Рекурсивный перебор элементов массива любой размерности»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int[,,,] a =
{
{
{
{1,2,3 },
{4,5,6 },
{7,8,9 }
},
{
{10,11,12},
{13,14,15},
{16,17,18}
}
},
{
{
{19,20,21 },
{22,23,24 },
{25,26,27 }
},
{
{28,29,30},
{31,32,33},
{34,35,36}
}
}
};
ForEach(a, Console.WriteLine);
Console.ReadKey();
}
static void ForEach(Array a, Action<object> act, int index = 0)
{
if (a == null || index < 0 || index >= a.Length) return;
int[] ind = new int[a.Rank];
FillIndArray(a, index, 0, ind);
act(a.GetValue(ind));
if (index < a.Length - 1) ForEach(a, act, index + 1);
}
private static void FillIndArray(Array a, int index, int dimension, int[] result)
{
int d, r;
d = Math.DivRem(index, a.GetLength(dimension), out r);
result[dimension] = r;
if (dimension < a.Rank - 1)
{
FillIndArray(a, d, dimension + 1, result);
}
}
}
}