Рекурсивный перебор элементов массива любой размерности - 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);
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы