【问题标题】:Fastest way to zero out a 2D array in C#在 C# 中将二维数组归零的最快方法
【发布时间】:2013-10-29 21:26:43
【问题描述】:

我有一个二维数组,我想清除它并将其重置为 0 值。我知道如何使用Array.Clear() 清除矢量(一维数组),但我不知道清除二维矩阵的最佳方法。

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

如何清除一个 2D N x M 数组

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

感谢您提供的任何帮助。

【问题讨论】:

    标签: c# .net arrays performance multidimensional-array


    【解决方案1】:

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

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

    注意,不需要自己计算长度,因为Length 属性会返回元素的总数,而不考虑维数:

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

    【讨论】:

    • ((IList)D).Clear() 等同于 Array.Clear(D, 0, D.Length) 并且 可能 更可取,如果只是因为使用Length 清除矩形数组乍一看似乎很奇怪。
    • @MikeStrobel 我从来没有想过这样使用它,因为对我来说IList.Clear 意味着“删除所有元素”,而不是“将所有元素设置为默认值”,但是是的,这似乎工作得很好.
    • D.Length 会和 M*N 一样吗?
    • @PBrenek 是的。或者更一般地说,它是数组所有维度的乘积。
    • 非常感谢。我很感激。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      只需重新分配它。

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

      创建一个空的二维数组。

      【讨论】:

      • 我实际上是为了这个。虽然它确实会产生一个 new 数组,它可能适合也可能不适合现有方法(并且确实对问题有一些回旋余地),但只有基准测试才能表明一种方法是否比另一种方法更适合.
      • 嗯,内存分配器会在获取内存后立即总是将数组归零,所以这总是会变慢。更不用说 GC 压力了。
      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 2023-02-06
      • 2023-04-04
      • 2017-01-26
      • 2015-03-30
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      相关资源
      最近更新 更多