2017-08-08 111 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