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



这可能是一个愚蠢的问题,但我仍然偶尔会发现意想不到的技巧

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

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

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

谢谢一百万

扩展创建

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

public static class ArrayExtensions
{
    public static IEnumerable<Tuple<int, int>> GetIndices<T>(this T[,] set)
    {
        for (var i = 0; i < set.GetLength(0); i++)
            for (var j = 0; j < set.GetLength(1); j++)
                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++)
            for (var j = 0; j < set.GetLength(1); j++)
                for (var k = 0; k < set.GetLength(2); k++)
                    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 [{indices.Item1}, {indices.Item2}, {indices.Item3}] = {value}");

最新更新