C#多维数组成列
我正在编写一个类,将三维数组作为一维数组保存 我在代码中有一个bug:当数组1x1(xz)的大小为空时,所有写入的元素都是空的 告诉我错误在哪里,告诉我已经有哪些库用于此C#多维数组成列,c#,arrays,multidimensional-array,C#,Arrays,Multidimensional Array,我正在编写一个类,将三维数组作为一维数组保存 我在代码中有一个bug:当数组1x1(xz)的大小为空时,所有写入的元素都是空的 告诉我错误在哪里,告诉我已经有哪些库用于此 public class Arr3D<T> { private T[] arr; private Vector3 min, max; private Vector3 size; public Arr3D() { arr = new T[0]; } public void AddOrReplace(T
public class Arr3D<T> {
private T[] arr;
private Vector3 min, max;
private Vector3 size;
public Arr3D()
{
arr = new T[0];
}
public void AddOrReplace(T obj, Vector3 pos)
{
Vector3 newMin = Vector3.Min(min, pos); // ( Min(x1,x2), Min(y1,y2), ...
Vector3 newMax = Vector3.Max(max, pos+Vector3.one); // +(1,1,1)
if(newMin != min || newMax != max)
{
Resize(newMin, newMax);
}
Set(obj, pos);
}
public void Set(T obj, Vector3 pos)
{
Set(obj, pos.x, pos.y, pos.z);
}
public void Set(T obj, int x, int y, int z)
{
arr[ (y-min.y)*size.x*size.y + (z-min.z)*size.x + (x-min.x) ] = obj;
}
private void Resize(Vector3 newMin, Vector3 newMax)
{
Vector3 oldMin = min;
Vector3 oldMax = max;
T[] oldList = arr;
Vector3 oldSize = size;
min = newMin;
max = newMax;
size = newMax - newMin;
arr = new T[size.z*size.y*size.x];
for(int x=oldMin.x; x<oldMax.x; x++)
{
for(int y=oldMin.y; y<oldMax.y; y++)
{
for(int z=oldMin.z; z<oldMax.z; z++)
{
T val = oldList[(y-oldMin.y)*oldSize.x*oldSize.y + (z-oldMin.z)*oldSize.x + (x-oldMin.x)];
Set(val, x, y, z);
}
}
}
}
public T Get(int x, int y, int z)
{
return arr[(y-min.y)*size.x*size.y + (z-min.z)*size.x + (x-min.x)];
}
}
公共类Arr3D{
私人T[]arr;
专用矢量器最小值为3,最大值为3;
私有向量3大小;
公共Arr3D()
{
arr=新的T[0];
}
公共无效添加或替换(T obj,矢量3位置)
{
向量3 newMin=Vector3.Min(Min,pos);/(Min(x1,x2),Min(y1,y2)。。。
Vector3 newMax=Vector3.Max(Max,pos+Vector3.one);//+(1,1,1)
if(newMin!=min | | newMax!=max)
{
调整大小(newMin,newMax);
}
设置(obj、pos);
}
公共无效集(T obj,矢量3位置)
{
套件(obj、x位置、y位置、z位置);
}
公共空集(T obj,int x,int y,int z)
{
arr[(y-min.y)*size.x*size.y+(z-min.z)*size.x+(x-min.x)]=obj;
}
专用空间大小调整(矢量3新建最小值、矢量3新建最大值)
{
向量3 oldMin=min;
向量3 oldMax=最大值;
T[]oldList=arr;
向量3 oldSize=大小;
min=newMin;
max=newMax;
大小=newMax-newMin;
arr=新的T[size.z*size.y*size.x];
对于(int x=oldMin.x;x,使用调整大小方法代替
T[] oldList = arr;
您应该复制arr(ay)的值,否则您将保留对arr的引用
T[] oldList ;
Array.Copy(arr,oldList,arr.Length) ;
有关更多详细信息,请参见调整大小方法中的方法,而不是
T[] oldList = arr;
您应该复制arr(ay)的值,否则您将保留对arr的引用
T[] oldList ;
Array.Copy(arr,oldList,arr.Length) ;
更多细节参见方法
将不起作用。一维数组存储一个三维元素。元素按虚线排列。也就是说,如果我们将x增加一个,新元素就不会是数组的末尾,在中间。@重要的想法是,需要创建每个值的拷贝。se如果您保留对arr的引用,然后调用“新”在arr上,您将以null结束values@user1164554你问的是关于空值的错误,不是关于如何在一维数组中实现三维数组。老实说,直到我发现没有理由创建新的对象实例和创建额外的垃圾收集器调用。是的,传输的链接,但问题出在哪里?@user1164554然后自由地尝试你自己的方法,解决它将不起作用。一维数组存储一个三维。元素排列成虚线。也就是说,如果我们把x增加一个,新的元素就不会是数组的末尾,在中间。@重要的想法是,你需要创建副本。每个值,因为如果您保留对arr的引用,然后调用“new”在arr上,您将以null结束values@user1164554你问的是关于空值的错误,不是关于如何在一维数组中实现三维数组。老实说,直到我发现没有理由创建新的对象实例和创建额外的垃圾收集器调用。是的,传输的链接,但问题出在哪里?@user1164554然后,请随意尝试您自己的方法和解决方案。如果旧列表引用arr,然后您对arr执行“新建”操作。如果旧列表引用arr,然后您对arr执行“新建”操作,则旧列表也将为空。旧列表也将为空