将一个3D数组的体积展平为一维对象数组

时间:2011-12-09 16:33:45

标签: c# .net arrays data-structures multidimensional-array

给我一​​个类型的3D地图,其长度和宽度均匀但深度是锯齿状的:

public class Map<T>
{
    T[,][] map;
    ...
}

返回由2D区域定义的体积内存在的所有类型对象的1D数组以及该区域内所有深度的最佳方法是什么。例如,我可能有一个数组符号覆盖,如下所示:

public IEnumerable<T> this[Rectangle area]
{
    get {...}
}

或只是

public IEnumerable<T> this[int x, int y, int width, int length]
{
    get {...}
}

我老实说希望有一个快速的LINQ解决方案,但性能优于解决方案的视觉优雅。返回的展平数组中对象的顺序并不重要。如果有人对此有任何建议或经验,请分享您的智慧。

或者,如果我可以使用的其他数据结构可以执行我不知道的相同功能,我很乐意使用它。

如果我的问题不清楚,请询问更多详情。

2 个答案:

答案 0 :(得分:2)

你在找这样的东西吗?

public IEnumerable<T> this[int left, int top, int width, int height]
{
    get
    {
        return from x in Enumerable.Range(left, width)
               from y in Enumerable.Range(top, height)
               from i in this.map[x, y]
               select i;
    }
}

答案 1 :(得分:1)

这可能也有效(没有Linq)

    public IEnumerable<T> this[int x, int y, int width, int length]
    {
        get
        {
            for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    for (int k = 0; k < map[x + i, y + j].Length; k++)
                    {
                        yield return map[x + i, y + j][k];
                    }
                }
            }
        }
    }