2016-09-24 45 views
-1

例:2次元配列内の要素のオカレンスのインデックスを見つけるコンパクトな方法はありますか?

は私が

var arr = new int[][] { 
    { 1, 9, 4 }, 
    { 2, 4, 4 }, 
    { 3, 0, 5 } 
}; 

を持っていると私は3のインデックスをしたいと言います。だから私は、理想的には任意の拡張メソッドを記述することなく、理想的にはコンパクトで効率的な方法で

Tuple<int,int> indices; 
for(int i = 0; i < arr.Length; ++i) 
    for(int j = 0; j < arr[i].Length; ++j) 
     if(arr[i][j] == 3) 
     return new Tuple<int,int>() { i, j } 

の同等を行う方法をしたいです。

+0

方法が定義されているので、あなたは、 '[、] INT [] []'ではなく '新しいint型=新しい必ず' VARの編曲ですこの例はコンパイルされません。言い換えれば、あなたは*ギザギザ*または* 2d *配列を求めていますか? –

+0

@IvanStoev '[、]'それでLINQを使うことができないので、 –

+0

を正しく呼んで、コンパイルした例を使ってください。 –

答えて

1

あなたは「コンパクト」な方法でLINQでこれを行うことができます - しかし、コメントが示唆するように、定期的なループは、効率のためにこれをtrounceます:

var indexes = arr.Select((a, x) => a.Select((v, y) => new { X = x, Y = y }) 
    .Where(z => arr[z.X][z.Y] == 3)).SelectMany(x => x); 

がさえ、LINQを使用して、あなたはまだ全体を横断する必要があり(ここでは匿名型に)インデックスを作成し、条件を満たすかどうかを判断してから、SelectManyを使用して結果をフラット化します。

また、これは単に最後に.First()を投げる最初のoccuranceを取得するために、すべてのインスタンスを返します注意してください。

私は強く、この場合には、静的なヘルパーや拡張メソッドをお勧めします:

+1

普通のループも読みやすくなります – Tibrogargan

関連する問題