2017-08-08 60 views
0

我写了一个小型项目,它将多个CSV文件读入锯齿状数组(每个csv在1个锯齿状数组中)。 所有的数组将被存储在一个列表中。之后,我有一个给定的维度,我想调整每个数组的大小(给定的列和行)。 代码:C# - 调整参考大小的锯齿状数组的大小

private void resizeArray(double[][] matrixToResize, int maxRow, int maxColumn) 
    { 
     Array.Resize(ref matrixToResize, maxRow); 

     for (int i = 0; i < matrixToResize.Length; i++) 
     { 
      Array.Resize(ref matrixToResize[i], maxColumn); 
     } 
    } 

    private void resizeArrayList(List<double[][]> csvList, Dimension dimension) 
    { 
     foreach (Double[][] matrix in csvList) 
     { 
      resizeArray(matrix, dimension.Max_Rows, dimension.Max_Columns); 
     } 
    } 

resizeArrayList将被称为1,然后这将调用resizeArray来调整行,之后调整为每行给定的列量。

我的问题:resizeArray这一切运作良好,例如: 我有5行5列的一个阵列,并希望10行10列,

我第一尺寸此阵10行之后,每行至10列。之前resizeArray返回到resizeArrayList它看起来很好,我有10行,每10列。但是在代码回到方法resizeArrayList之后,它有5行,每列有10(!)列。所以基本上调整大小的工作正常,但添加的5行不见了,它回到它原来的行大小。

我知道我可以解决这个问题,把整个交错的数组传回来,然后读这个列表。但为什么会这样呢?

这两次我都使用resize函数与ref。但它只是保存列而不是调整大小的行。

回答

1

您将不得不通过matrix变量通过引用,因为引用本身正在修改resizeArray方法。在你这样做的过程中,csvList列表中的所有元素保持不变 - 长度为5的数组 - 因为csvList仍由旧的引用组成,即在调整大小之前的那些引用。

但是,matrix是循环变量,您不能在循环内更改它,这意味着您不能通过引用resizeArray来传递它。出于这个原因,我认为你会更好地创建一个全新的名单,结果如下:

private double[][] resizeArray(double[][] matrixToResize, 
           int maxRow, int maxColumn) 
{ 
    Array.Resize(ref matrixToResize, maxRow); 

    for (int i = 0; i < matrixToResize.Length; i++) 
    { 
     Array.Resize(ref matrixToResize[i], maxColumn); 
    } 

    return matrixToResize; 
} 

private void resizeArrayList(List<double[][]> csvList, Dimension dimension) 
{ 
    csvList = csvList 
     .Select(matrix => 
      resizeArray(matrix, dimension.Max_Rows, dimension.Max_Columns)) 
     .ToList(); 
} 
+0

啊,这是有道理的!非常感谢你清理这个,我很困惑!谢谢!祝你今天愉快 – christian890