我有一个数组(object [,,]),让我们假设参数为x1000,y1000,z * 1000并且表示x,y,z平面上的点矩阵。
在位置:x50,y10,z199,例如我想从父数组中提取另一个包含较小立方体的对象[,,],比如100个立方体的子矩阵(或者任何可用的子空间,如果为空则为空?)使用参考点作为中心点,这是可能的,我希望我能在linq中做到这一点但是却无可救药地丢失了......你将如何解决这个问题...一个虽然是要做以下事情:
1.创建一个新的3d数组,其中包含我想要检索的项目数量(xyz)。
2.迭代每个轴(x,y,z)。
3.将源数组中的值复制到目标数组(offsetX + x,offsetY + y,offsetZ + z)。
4.返回新阵列。
但如果这个被大量调用,我认为它是一个瓶颈,任何人的想法?
答案 0 :(得分:1)
根据您对较小阵列的使用情况,这可能适合您的需求,也可能不适合您。
要表示数组的子节(块),而不是创建新数组或进行任何复制,您可以编写自己的类,作为视图到该数组块。< / p>
请注意,此示例具有以下属性:
public static class ArrayChunkExtensions
{
public static ArrayChunk<T> GetChunk<T>(this T[,,] array, int x, int y, int z, int numToExpand)
{
return new ArrayChunk<T>(array, x, y, z, numToExpand);
}
}
要轻松从数组中获取块,您可以声明一个扩展方法:
Action<int, Action<int, int, int>> iterate = (length, action) =>
{
for (int x = 0; x < length; x++)
for (int y = 0; y < length; y++)
for (int z = 0; z < length; z++)
action(x, y, z);
};
// Create 5x5x5 parent array.
const int size = 5;
var array = new string[size, size, size];
iterate(size, (x, y, z) => array[x, y, z] = $"x:{x} y:{y} z:{z}");
// Take 3x3x3 chunk from parent array center.
const int indexOfReference = 2;
const int numToExpand = 1;
ArrayChunk<string> chunk = array.GetChunk(indexOfReference, indexOfReference, indexOfReference, numToExpand);
iterate(chunk.Length, (x, y, z) => Console.WriteLine(chunk[x, y, z]));
以下是一个示例用法:
{{1}}