从锯齿状数组中获取子数组

时间:2015-09-13 07:11:11

标签: c# .net jagged-arrays

我的例程的输入是一个锯齿状的数组(不幸的是,我必须忍受它)。它代表一个数据表(行和单元格)。

现在我必须输出另一个锯齿状数组作为给定输入的子数组,即我希望行500-1000。

有一个很好的方法吗?甚至可能在现有数据之上的 view 之类的东西?

到目前为止,我已经实现了最糟糕的情况:创建第二个锯齿状数组并将子数组复制到它。

希望有更好的方式告诉我: - )

3 个答案:

答案 0 :(得分:1)

如果我理解正确,那么可能是这个吗?

var subArray = yourArray.Skip(500).Take(500).ToArray();

答案 1 :(得分:0)

例如,您可以使用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
}

答案 2 :(得分:0)

我认为你的意思是使用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而不是内循环。

试试这个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);
        }
    }
}