C# - 使用引用调整锯齿状数组的大小
C# - Resizing jagged arrays with references
我写了一个小项目,它将多个 CSV 文件读取到一个锯齿状数组中(每个 csv 在 1 个锯齿状数组中)。
所有的数组都将存储在一个列表中。之后,我有一个给定的维度,我想将每个数组的大小调整为(具有给定的列和行)。
代码:
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
returns 到 resizeArrayList
之前看起来不错,我有 10 行,每 10 列。但是在代码回退到方法 resizeArrayList
之后,它有 5 行,每行 10(!)列。所以基本上列大小调整工作正常,但是添加的 5 行消失了,它回到了原来的行大小。
我知道我可以通过将整个锯齿状数组传回并将这个数组读入列表来解决这个问题。但是为什么会这样呢?
两次我都使用 ref 的调整大小功能。但它只保存列而不是调整大小的行。
您必须通过引用传递 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();
}
我写了一个小项目,它将多个 CSV 文件读取到一个锯齿状数组中(每个 csv 在 1 个锯齿状数组中)。 所有的数组都将存储在一个列表中。之后,我有一个给定的维度,我想将每个数组的大小调整为(具有给定的列和行)。 代码:
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
returns 到 resizeArrayList
之前看起来不错,我有 10 行,每 10 列。但是在代码回退到方法 resizeArrayList
之后,它有 5 行,每行 10(!)列。所以基本上列大小调整工作正常,但是添加的 5 行消失了,它回到了原来的行大小。
我知道我可以通过将整个锯齿状数组传回并将这个数组读入列表来解决这个问题。但是为什么会这样呢?
两次我都使用 ref 的调整大小功能。但它只保存列而不是调整大小的行。
您必须通过引用传递 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();
}