Search code examples
c#loopsmultidimensional-arraysystem.array

C# loop over an array of unknown dimensions


I want to create an extension method to loop over System.Array with unknown number of dimensions

For now I am using a naive approach:

public static void ForEach<T>(this Array source, Action<T> action)
{
    if(source.Rank == 1)
    {
        for (int w = 0; w < source.GetLength(0); w++)
        {
            action((T)source.GetValue(w));
        }
    }
    else if(source.Rank == 2)
    {
        for (int h = 0; h < source.GetLength(1); h++)
        {
            for (int w = 0; w < source.GetLength(0); w++)
            {
                action((T)source.GetValue(h, w));
            }
        }
    }
    else if(source.Rank == 3)
    {
        // etc
    }
}

I am sure, there is much more elegant way of doing that. But I can not figure it out. How do I generalize that method for unlimited number of dimensions ?


Solution

  • If you don't care about the indices, you can just iterate over a System.Array with absolutely no knowledge of its Rank. The enumerator will hit every element.

    public class Program
    {
        public static void IterateOverArray(System.Array a)
        {
            foreach (var i in a)
            {
                Console.WriteLine(i);
            }
        }
    
        public static void Main()
        {
            var tests = new System.Array []
            {
                new int[] {1,2,3,4,5,6,7,8},
                new int[,]
                {
                    {1,2},{3,4},{5,6},{7,8}
                },
                new int[,,]
                {
                    {  {1,2},{3,4} },
                    {  {5,6},{7,8} }
                }
            };
    
    
            foreach (var t in tests)
            {
                Console.WriteLine("Dumping array with rank {0} to console.", t.Rank);
                IterateOverArray(t);
            }
        }
    }
    

    Output:

    Dumping array with rank 1 to console.
    1
    2
    3
    4
    5
    6
    7
    8
    Dumping array with rank 2 to console.
    1
    2
    3
    4
    5
    6
    7
    8
    Dumping array with rank 3 to console.
    1
    2
    3
    4
    5
    6
    7
    8
    

    Link to DotNetFiddle example