【问题标题】:C# Using Linq to get column from jagged arrayC# 使用 Linq 从锯齿状数组中获取列
【发布时间】:2011-12-06 00:48:22
【问题描述】:

如何使用 Linq 从锯齿状数组中获取列的元素作为平面数组????

public class Matrix<T>
{
    private readonly T[][] _matrix;

    public Matrix(int rows, int cols)
    {
        _matrix = new T[rows][];
        for (int r = 0; r < rows; r++)
        {
            _matrix[r] = new T[cols];
        }
    }

    public T this[int x, int y]
    {
        get { return _matrix[x][y]; }
        set { _matrix[x][y] = value; }
    }

    // Given a column number return the elements
    public IEnumerable<T> this[int x]
    {
        get
        {
        }
    }
}

Matrix<double> matrix = new Matrix<double>(6,2);
matrix[0, 0] = 0;
matrix[0, 1] = 0;
matrix[1, 0] = 16.0;
matrix[1, 1] = 4.0;
matrix[2, 0] = 1.0;
matrix[2, 1] = 6.0;
matrix[3, 0] = 5.0;
matrix[3, 1] = 7.0;
matrix[4, 0] = 1.3;
matrix[4, 1] = 1.0;
matrix[5, 0] = 1.5;
matrix[5, 1] = 4.5;

【问题讨论】:

  • Mmh...您能否提供输入数据和所需输出的示例?
  • 声明你想要展平的数组
  • 对不起,我一定忘记了...

标签: c# linq jagged-arrays


【解决方案1】:

只是:

public IEnumerable<T> this[int x]
{
    get
    {
       return _matrix.Select(row => row[x]);
    }
}

当然最好在 LINQ 查询之前检查x 是否超出范围。

无论如何,鉴于您正在处理矩阵,为了更清晰,您可以切换到 bidimensional array 而不是锯齿状数组(所以毫无疑问二维的大小)。

相反,如果性能对您来说真的很重要,请继续使用锯齿状数组,它似乎比二维数组快一点(例如LINK1LINK2)。

【讨论】:

  • 在我看来这会更好:_matrix.Where(array =&gt; array.Length &gt; index).Select(array =&gt; array[index])
  • @YuriyRozhovetskiy:其实这个控件可以在查询之前进行,因为这个锯齿状数组在构造上总是有相同的列数。
  • @digEmAll 我明白你的意思。是因为锯齿可以有混合尺寸吗?
  • @kuzyt:是的,但这只是语法/清晰度的问题。如果性能对你来说真的很重要,锯齿状数组似乎比多维数组快一点(检查我的编辑)。
【解决方案2】:
var source = new int[3][] {
    Enumerable.Range(1,3).ToArray(),
    Enumerable.Range(10,5).ToArray(),
    Enumerable.Range(100,10).ToArray()
};

int index = 0;

var result = (from array in source
                from item in array
                group item by Array.IndexOf(array, item) into g
                where g.Key == index
                select g.ToArray()).FirstOrDefault();

【讨论】:

    【解决方案3】:
    var q = from row in jagged 
        from value in row 
        where value == anyvalue 
        select value; 
    

    你为什么要使用 LINQ?使用经典的它会提高性能并更容易调试

    【讨论】:

    • 您的 where 子句适用于值,但为了始终选择同一列,我认为它应该适用于索引...
    • 一般来说,我会使用一个更快、更容易调试的经典版本。您应该只使用 LINQ 来反对以提高可读性,因为通常经典 for 更快
    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多