4

私はプロジェクトに取り組んでおり、ネストされたforループを使用してギザギザの配列を繰り返しループしていることに気づきました。を使用してそれを行うためのより良い方法があるのではないかと思っていforeachますか?

これが私が意味することです:

for (int ii = 0; ii < xDimension; ii++)
  {
    for (int jj = 0; jj < yDimension; jj++)
      {
        OutputArray[ii][jj] = someFunction(InputArray[ii][jj]);
      }
  }

ジャグ配列は多次元配列よりも高速であるため、データが固定サイズであっても、ジャグ配列を使用していることに注意してください。残念ながら、このプロジェクトでは速度が問題になるため、残念ながら、パフォーマンスは自分の OCD コーディングの欲求を上回ります。

foreachネストされたforループを回避し、出力データを正しい場所に配置する方法はありOutputArrayますか? 少しきれいなコードを使用する以外に、(可能であれば)そうすることによる利点/損失はありますか?

4

5 に答える 5

3

結果として本当にジャグ配列を作成したい場合は、次のArray.ConvertAll2つを使用できます。

var result = Array.ConvertAll(input,
                              array => Array.ConvertAll(array, SomeFunction));

Selectこれは、 / ToArrayfrom LINQを使用するよりもわずかに効率的です。これは、配列を別の配列に変換していることがわかっているため、ターゲット配列をすぐに作成できるためです。Select続いてを使用するToArrayには、結果をに入れているかのように徐々に構築しList<T>、バッファが使い果たされたときにコピーし、最後に配列を「適切なサイズ」にする必要があります。

一方、(ダニエルの答えによると)LINQを使用することは、最近ではおそらくより慣用的なものになるでしょう...そしてパフォーマンスの違いは通常重要ではありません。私はこれを別のオプションとして与えると思いました:)

(これにより、既存の配列が無視されて新しい配列が作成されることに注意してくださいOutputArray...既存の配列の作成を取り除くことができると思いますがOutputArray、そうではない場合もあります...)

于 2013-02-14T15:17:22.757 に答える
1

を使用すると、ジャグ配列からデータをより簡単に取得できますforeachが、インデックスを示す変数がないため、例のように配列の値を非常に効果的に設定することはできません。

ただし、値を読みたいだけの場合は、次のようにすることができます。

foreach(int n in OutputArray.SelectMany(array=>array))
{
    Console.WriteLine(n);
}

シーケンスをフラット化するために必要です。そのSelectManyため、シーケンスのシーケンスではなく、単一のシーケンスになります。

于 2013-02-14T15:12:45.317 に答える