C# 调整矩形阵列的大小

C# 调整矩形阵列的大小,c#,.net,arrays,C#,.net,Arrays,是否存在比下面更聪明的方法来调整矩形阵列的大小 double[,] temp = new double[newSize, originalSecondDimension]; Array.Copy(original, temp, original.Length); 我关心的是复制一个巨大的数组和所需的内存。Array.Resize在内部做什么 谢谢 Alberto您应该将性能微观优化推迟到您实际测量和观察问题的时候。也就是说 在.NET中调整数组的大小需要重新分配它们。NET进程中的内存通常没有

是否存在比下面更聪明的方法来调整矩形阵列的大小

double[,] temp = new double[newSize, originalSecondDimension];
Array.Copy(original, temp, original.Length);
我关心的是复制一个巨大的数组和所需的内存。Array.Resize在内部做什么

谢谢

Alberto

您应该将性能微观优化推迟到您实际测量和观察问题的时候。也就是说

在.NET中调整数组的大小需要重新分配它们。NET进程中的内存通常没有间隙,因此如果不将数组移动到堆中的新位置,就无法调整数组之类的对象的大小

通常情况下,您不应该关心调整大小在内部的工作方式,但在本例中,实际上明确描述了发生的情况:

此方法使用 指定的大小将复制元素 从旧阵列到新阵列,以及 然后将旧阵列替换为 新的

请记住,.NET中的内存分配是非常有效的—它主要涉及将高水位指针向上移动到堆的地址空间,并将内存归零。除非您正在分配一个非常大的阵列,或者在一个紧密的循环中一遍又一遍地分配,否则您不太可能遇到问题

在你的例子中,没有更好的方法来调整多维数据的大小。但是,您应该强烈考虑将此行为封装在自定义类中。传递原始数组对象不是一个好主意——有太多的方法会出错。特别是,当调整大小时,会出现一个新的数组实例,这可能会破坏保留对旧数组实例的引用并假定它们仍然有效的任何代码

您始终可以创建一个类,该类提供索引器属性,并具有多维数组的语法外观,而无需实际公开。不幸的是,据我所知,.NET类库中没有内置的多维集合类。然而,编写一个简单的包装不应该太难

顺便说一句,如果您真正关心性能,您应该知道.NET多维数组的执行速度明显低于一维数组,甚至是锯齿状数组双[][]。

您应该推迟性能微观优化,直到您实际测量并观察到问题为止。也就是说

在.NET中调整数组的大小需要重新分配它们。NET进程中的内存通常没有间隙,因此如果不将数组移动到堆中的新位置,就无法调整数组之类的对象的大小

通常情况下,您不应该关心调整大小在内部的工作方式,但在本例中,实际上明确描述了发生的情况:

此方法使用 指定的大小将复制元素 从旧阵列到新阵列,以及 然后将旧阵列替换为 新的

请记住,.NET中的内存分配是非常有效的—它主要涉及将高水位指针向上移动到堆的地址空间,并将内存归零。除非您正在分配一个非常大的阵列,或者在一个紧密的循环中一遍又一遍地分配,否则您不太可能遇到问题

在你的例子中,没有更好的方法来调整多维数据的大小。但是,您应该强烈考虑将此行为封装在自定义类中。传递原始数组对象不是一个好主意——有太多的方法会出错。特别是,当调整大小时,会出现一个新的数组实例,这可能会破坏保留对旧数组实例的引用并假定它们仍然有效的任何代码

您始终可以创建一个类,该类提供索引器属性,并具有多维数组的语法外观,而无需实际公开。不幸的是,据我所知,.NET类库中没有内置的多维集合类。然而,编写一个简单的包装不应该太难


顺便说一句,如果您真正关心性能,您应该知道.NET多维数组的执行速度明显低于一维数组,甚至是锯齿数组双[][]。

是的,有一种更明智的方法:不要使用数组!如果您发现自己有一个需要重新调整大小的数组,那么应该使用集合类型。

是的,有一个更聪明的方法:不要使用数组!如果您发现自己有一个需要重新调整大小的数组,那么应该使用集合类型。

我猜您不能。Array.Resize接受一个ref T[],表明它的工作原理如下:

int[] a = new int[1];
int[] b = a;
Array.Resize(b,2);
Debug.Assert(a.Length == 1);
Debug.Assert(b.Length == 2);
如果数组可以改变大小,那么在并发代码中,您无法优化边界检查,并且您必须为每次访问做一些事情来阻止它改变您脚下的大小:

for (int i = 0; i < a.Length; i++) { sum += a[i]; }
可能会有一个例外:理论上,如果提供数组,则可以增加数组的大小
不必重新分配内存对齐可能意味着通常可以将字节[1]调整为字节[4]。不过,阵列将被重新分配的情况要常见得多,因此担心这一点没有什么意义。

我猜你不能。Array.Resize接受一个ref T[],表明它的工作原理如下:

int[] a = new int[1];
int[] b = a;
Array.Resize(b,2);
Debug.Assert(a.Length == 1);
Debug.Assert(b.Length == 2);
如果数组可以改变大小,那么在并发代码中,您无法优化边界检查,并且您必须为每次访问做一些事情来阻止它改变您脚下的大小:

for (int i = 0; i < a.Length; i++) { sum += a[i]; }

可能有一个例外:理论上可以增加阵列的大小,前提是阵列不必重新分配内存对齐可能意味着通常可以将字节[1]调整为字节[4]。不过,阵列将被重新分配的情况要常见得多,因此没有必要担心这一点。

不过有一件事需要提及。。。不,没有更好的方法来处理多维数据。您可以收集collections@Joel当然可以,但我仍然会编写一个包装器类来控制所需的语义。例如,在锯齿数组或集合集合中,如果一个集合的大小可以调整为大于其他集合,则可能会出现问题。只有OP知道他需要什么-但是封装你想要的行为从来都不是一个坏主意-而不是将知识和规则传播到代码中的多个地方。你怎么能说锯齿数组比矩形数组快?在我看来,这似乎是不可能的。。。你是否考虑创建、填充和访问它们?编写一些测试代码并查看emmitted IL,然后对其进行读取、写入和大小调整。或者阅读这篇文章——它讨论了.NET阵列的性能特征:不过有一件事需要提及。。。不,没有更好的方法来处理多维数据。您可以收集collections@Joel当然可以,但我仍然会编写一个包装器类来控制所需的语义。例如,在锯齿数组或集合集合中,如果一个集合的大小可以调整为大于其他集合,则可能会出现问题。只有OP知道他需要什么-但是封装你想要的行为从来都不是一个坏主意-而不是将知识和规则传播到代码中的多个地方。你怎么能说锯齿数组比矩形数组快?在我看来,这似乎是不可能的。。。你是否考虑创建、填充和访问它们?编写一些测试代码并查看emmitted IL,然后对其进行读取、写入和大小调整。或者阅读本文—它讨论了.NET阵列的性能特征:依赖。如果实现使用向量、矩阵、超立方体等定义算法的数学模型,.NET数组可能是存储数据的最佳/最有效方式。即使它们需要一个围绕它们编写的包装器类以便于使用。如果实现使用向量、矩阵、超立方体等定义算法的数学模型,.NET数组可能是存储数据的最佳/最有效方式。即使它们需要围绕它们编写一个包装类以便于使用。Resize的文档清楚地说明了它的工作原理:此方法分配具有指定大小的新数组,将元素从旧数组复制到新数组,然后用新数组替换旧数组。调整大小的文档清楚地说明了它的工作原理:此方法分配具有指定大小的新数组,将元素从旧数组复制到新数组,然后用新数组替换旧数组。