【问题标题】:Obtain sub array from jagged array从锯齿状数组中获取子数组
【发布时间】:2015-12-09 09:59:18
【问题描述】:

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

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

有什么好的方法吗?甚至可能是现有数据之上的视图

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

希望有更好的方法可以告诉我:-)

【问题讨论】:

  • 发布您当前的代码。
  • @Rahul:想不出为什么这对回答我的问题是否有“好”的方法有任何用处。我已经以某种方式描述了我当前的解决方案,以便每个人都可以想象当前的解决方案是什么样的。
  • 你不应该要求一个“好”的答案。 “nice”主要基于意见
  • 附言。微软发布了一些使用锯齿矩阵进行线性代数的标准代码here

标签: c# .net jagged-arrays


【解决方案1】:

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

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

【讨论】:

  • 这只获取行。每行都需要另一组 LINQ 来提取特定列。
  • @ja72 但是 OP 希望有一个新的锯齿状数组,其中包含 500-1000 行 - 所以这是正确的答案
【解决方案2】:

我认为你的意思是使用 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);
        }
    }
}

【讨论】:

    【解决方案3】:

    例如,您可以尝试这种方法,使用 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
    }
    

    【讨论】:

    • T[,] 不是锯齿状数组。锯齿状数组是T[][]
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2015-09-23
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多