2011-12-09 46 views
4

给我有类型,其长度和宽度是均匀的,但深度为锯齿状的3D地图:拼合一个三维阵列的体积为对象的一维数组

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

什么是最好的方式返回由2D区域定义的体积内的所有类型对象以及该区域内的所有深度的一维数组。

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

或只是

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

我诚实地希望一个快速LINQ解决方案,但性能是最好的解决方案视觉优雅:举例如下,我可能有一个数组符号覆盖。返回的扁平数组内的对象的顺序不重要。如果有人有任何建议或经验,请分享你的智慧。

另外,如果有另一个数据结构可以执行我不知道的相同功能,我会很乐意使用它。

如果有关于我的问题的内容不清楚,请询问更多详情。

回答

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]; 
        } 
       } 
      } 
     } 
    } 
+0

这个解决方案和LINQ解决方案都很好,这个比LINQ有一个小的性能提升,这就是为什么我给你答案。 – LamdaComplex

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; 
    } 
} 
+0

这个解决方案的伟大工程,但比稍慢for循环的解决方案。只是轻微。当遍历4700x4700区域时,此解决方案的计时时间为3.4秒,for循环解决方案为1.7秒。 – LamdaComplex