从锯齿数组中获取子数组
本文关键字:数组 获取 | 更新日期: 2023-09-27 18:12:34
我的例程的输入是一个锯齿数组(不幸的是,我不得不忍受它)。它表示一个数据表(行和单元格)。
现在我必须输出另一个锯齿数组作为给定输入的子数组,即我想要拥有500-1000行。
有什么好办法吗?也许甚至是在现有数据之上添加一个视图 ?
我已经实现了迄今为止最坏的情况:创建第二个锯齿数组并将子数组复制到它。
希望有更好的方式告诉我:-)
如果我理解正确,那么可能是这个?
var subArray = yourArray.Skip(500).Take(500).ToArray();
我想你的意思是使用LINQ
public double[][] GetSubMatrix(int row, int col, int row_count, int col_count)
{
return elements.Skip(row).Take(row_count).Select(
(each_row) => each_row.Skip(col).Take(col_count).ToArray()).ToArray();
}
我对矩阵结构的偏好是使用没有LINQ的锯齿数组。你不能使用LINQ轻松地在数组上设置值,并且命令在一段时间后会变得相当长和愚蠢。
我确实尽可能多地使用Array.Copy
而不是inner loops。
试试这个Matrix
泛型类示例:
public class Matrix<T>
{
readonly int rows, cols;
readonly T[][] elements;
public Matrix(int rows, int cols)
{
this.rows=rows;
this.cols=cols;
this.elements=new T[rows][];
for(int i = 0; i<rows; i++)
{
elements[i]=new T[cols];
}
}
public int Rows { get { return rows; } }
public int Columns { get { return cols; } }
public T this[int row, int col]
{
get { return elements[row][col]; }
set { elements[row][col]=value; }
}
public T[] GetRow(int row) { return elements[row]; } // This is fast
public T[] GetColumn(int col) // This is slow
{
T[] column = new T[rows];
for(int i = 0; i<rows; i++)
{
column[i]=elements[i][col];
}
return column;
}
public T[][] GetSubMatrix(int row, int col, int row_count, int col_count)
{
T[][] result = new T[row_count][];
for(int i = 0; i<row_count; i++)
{
// This is fast
Array.Copy(elements[row+i], col, result[i], 0, col_count);
}
return result;
}
public void SetSubMatrix(int row, int col, T[][] matrix)
{
int row_count = matrix.Length;
int col_count = row_count>0 ? matrix[0].Length : 0;
for(int i = 0; i<row_count; i++)
{
// This is fast
Array.Copy(matrix[i], 0, elements[row+i], col, col_count);
}
}
}
例如,您可以尝试这种方法,使用yield
关键字。
public IEnumerable<T[]> GetRowRange<T>(T[][] jaggedArray, int rowStart, int rowEnd)
{
for(var idx = rowStart; idx <= rowEnd; idx ++)
{
yield return GetRowValues(jaggedArray, idx).ToArray();
}
}
public IEnumerable<T> GetRowValues<T>(T[][] jaggedArray, int row)
{
for (var col = 0; col < jaggedArray.Length; col++)
{
yield return jaggedArray[row][col];
}
}
,下面是用法:
var rowRange = GetRowRange(jaggedArray, 2, 3);
foreach(var row in rowRange)
{
//do something
}