用于多维集合迭代的C#中的任何简写?

时间:2018-01-23 01:58:26

标签: 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++) {
             set[i,j,k].DoSomething();
         }
    }
}

我经常需要我的(i j k)迭代器,所以我不是在寻找一个foreach。

我只是想知道是否有办法用更少的击键来实现非常相似的东西?

万分感谢,

1 个答案:

答案 0 :(得分:1)

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

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]);
        }
    }
}

样本使用

set.ForEach((indices, value) => Console.WriteLine("Value at [{0},{1},{2}] = {3}", indices.Item1, indices.Item2, indices.Item3, value));