在C#中将二维数组清零的最快方法

18

我有一个2D数组,我想要清空并重置为0值。我知道如何使用Array.Clear()清空向量(1D数组),但是我不知道清空2D矩阵的最佳方法。

double D = new double[10];  
Array.Clear(D, 0, D.Length);

如何清空一个二维 N x M 数组

double D[,] = new double[N,M];

感谢您可能提供的任何帮助。

3个回答

41

Array.Clear也适用于多维数组:

double[,] D = new double[M,N];
Array.Clear(D, 0, D.Length);

请注意,不需要自己计算长度,因为Length 属性返回元素的总数,而不管维数如何:

32位整数,表示数组所有维度的元素总数;如果数组中没有元素,则为零。


2
((IList)D).Clear() 等同于 Array.Clear(D, 0, D.Length),并且如果仅仅因为使用 Length 来清空一个矩形数组看起来有些奇怪,它可能更可取。 - Mike Strobel
3
@MikeStrobel,我从来没有考虑过这样使用它,因为对我来说IList.Clear的意思是“删除所有元素”,而不是“将所有元素设置为默认值”,但是看起来完全可以正常工作。 - p.s.w.g
D.Length会和M*N相同吗? - PBrenek
1
@PBrenek 是的。或者更一般地说,它是数组所有维度的乘积。 - p.s.w.g
@p.s.w.g 所以 ((IList)D).Clear() 是否也会将值设置为默认值? - GelatinFox
显示剩余3条评论

1

你可以使用相同的方法,但是你可能需要计算你真正的length参数值:

double D[,] = new double[N,M];
Array.Clear(D, 0, M*N);

我会使用M*N,因为它更易读,而且我不知道Length属性对于二维数组返回什么。

-1

只需重新分配它。

double D[,] = new double[N,M];

创建一个空的二维数组。

1
我实际上支持这个。虽然它会导致一个新的数组,可能适合或不适合现有的方法(并且对问题进行了一些放宽),但只有基准测试才能表明哪种方法比另一种更适合。 - user2864740
11
好的,内存分配器在获取内存后将始终立即清零数组,因此这将始终更慢。更不用说垃圾回收的压力了。 - John Gietzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接