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 ?
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