8

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;
4

3 に答える 3

13

それはただ:

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

もちろんx、LINQ クエリの前に が範囲外でないかどうかを確認することをお勧めします。

とにかく、行列で作業していることを考えると、より明確にするために、ギザギザ配列の代わりに2 次元配列に切り替えることができます(2 次元のサイズについては間違いありません)。

代わりに、パフォーマンスが本当に重要な場合は、二次元配列よりも少し高速に見えるギザギザ配列を使い続けてください (例: LINK1LINK2 )。

于 2011-10-12T11:02:57.833 に答える
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();
于 2011-10-12T10:59:41.340 に答える
0
var q = from row in jagged 
    from value in row 
    where value == anyvalue 
    select value; 

とにかく、なぜLINQを使いたいのですか?クラシックを使用すると、パフォーマンスが向上し、デバッグが容易になります

于 2011-10-12T10:50:15.747 に答える