Arrays 多维集合迭代的C#缩写?

Arrays 多维集合迭代的C#缩写?,arrays,multidimensional-array,Arrays,Multidimensional Array,这可能是一个愚蠢的问题,但我偶尔还是会发现意想不到的窍门… 我经常处理二维和三维数组。我经常需要使用索引遍历所有元素。因此,我最终一遍又一遍地编写相同的嵌套循环结构 for (int i = 0; i < set.GetLength(0); i++) { for (int j = 0; j < set.GetLength(1); j++) { for (int k = 0; k < set.GetLength(2); k++) {

这可能是一个愚蠢的问题,但我偶尔还是会发现意想不到的窍门…

我经常处理二维和三维数组。我经常需要使用索引遍历所有元素。因此,我最终一遍又一遍地编写相同的嵌套循环结构

for (int i = 0; i < set.GetLength(0); i++) {
    for (int j = 0; j < set.GetLength(1); j++) {
         for (int k = 0; k < set.GetLength(2); k++) {
             set[i,j,k].DoSomething();
         }
    }
}
for(int i=0;i
我经常需要我的(ijk)迭代器,所以我不是在寻找foreach

我只是想知道是否有一种方法可以用更少的按键来实现类似的效果


多亏了一百万,

扩展了创建索引矩阵的思想,您可以为需要使用的每个数组维数创建一组扩展方法,这样就可以从程序逻辑中删除嵌套循环

static class ArrayExtensions
{
    public static IEnumerable<Tuple<int, int>> GetIndices<T>(this T[,] set)
    {
        for (var i = 0; i < set.GetLength(0); i += 1)
        {
            for (var j = 0; j < set.GetLength(1); j += 1)
            {
                yield return new Tuple<int, int>(i, j);
            }
        }
    }

    public static IEnumerable<Tuple<int,int,int>> GetIndices<T>(this T[,,] set)
    {
        for (var i = 0; i < set.GetLength(0); i += 1)
        {
            for (var j = 0; j < set.GetLength(1); j += 1)
            {
                for (var k = 0; k < set.GetLength(2); k += 1)
                {
                    yield return new Tuple<int, int, int>(i, j, k);
                }
            }
        }
    }

    public static void ForEach<T>(this T[,] set, Action<Tuple<int,int>, T> loopBody)
    {
        foreach (var indices in GetIndices(set))
        {
            loopBody(indices, set[indices.Item1, indices.Item2]);
        }
    }

    public static void ForEach<T>(this T[,,] set, Action<Tuple<int, int, int>, T> loopBody)
    {
        foreach (var indices in GetIndices(set))
        {
            loopBody(indices, set[indices.Item1, indices.Item2, indices.Item3]);
        }
    }
}

您可以使用
元组(或n元组,其中n=维度数)为每个维度创建索引值矩阵,然后在元组列表上创建
foreach
。现在有一个想法!似乎满足了甜蜜/击键请求。不知道我在期待什么,但这很聪明。我喜欢这个主意。它类似于我已经做过的事情(使用类似元组的结构),但我从未构建过扩展。一定要试试这个。非常感谢,
set.ForEach((indices, value) => Console.WriteLine("Value at [{0},{1},{2}] = {3}", indices.Item1, indices.Item2, indices.Item3, value));