2011-10-12 18 views
6

ギザギザの配列からLinqを使用してフラットな配列としてカラムの要素を取得する方法を教えてください。C#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; 
+3

Mmh ...入力データと出力の例を教えてください。 – digEmAll

+1

フラット化したい配列の宣言を与える – sll

+0

残念ですが忘れてしまったかもしれません... – nixgadgets

答えて

11

それはちょうどです:もちろん

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

それはxは、LINQクエリの前に範囲外でないかどうか確認すると良いでしょう。

とにかく、マトリクスで作業している場合は、ギザギザの配列ではなくbidimensional arrayに切り替えることができます(2次元のサイズについては間違いありません)。

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

+0

私の意見では、これはより良いでしょう: '_matrix.Where(array => array.Length> index).Select(array => array [インデックス)] ' –

+0

@YuriyRozhovetskiy:実際には、この調整はクエリの前に行うことができます。なぜなら、このギザギザの配列は常に同じ数の列を構築するためです。 – digEmAll

+0

@digEmAllなぜマルチアレイは私の場合にギザギザよりも優れているのですか? – nixgadgets

0
var q = from row in jagged 
    from value in row 
    where value == anyvalue 
    select value; 

とにかく、なぜあなたは、LINQを使用したいのですか?それは、パフォーマンスを向上させ、より簡単にデバッグを行いますためのクラシックを使用して

+0

where節が値に作用しますが、常に同じ列を選択するためには、インデックス上で動作するはずです。 。 – digEmAll

+0

一般的に、私はより高速で簡単にデバッグするための古典を使用します。 LINQを使用して、読みやすさを向上させるためにのみオブジェクトを使用する必要があります。一般的に古典的な方法ははるかに高速です –

1
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(); 
関連する問題