0

これは一般的なプログラミングの質問です。

double forループを介して2次元配列を反復処理することは「恐ろしい」「醜い」などであるという多くの投稿を見てきました...これはなぜですか?

配列は辞書などに比べて効率的なデータ構造ではありませんか?また、foreach やその他の代替手段よりも double for ループの方が効率的ではありませんか? また、2D 配列を使用している場合は、2D 座標系を扱っていることがよくあります。x と y の位置は、配列のインデックスとしてデータ構造に既に「組み込まれている」ため (たとえば、辞書キーとしてタプルを追加する必要はありません)、for ループ パラメーターを変更することで、非常に安価に反復できます。繰り返したくない部分を完全に無視しながら、グリッドのさまざまな部分を通過します。たとえば、「外側」の行と列を避けるには..

for (int x = 1; x < Grid.GetLength(0)-1; x++)
{
        for (int y = 1; y < Grid.GetLength(1)-1; y++)
        {
            Grid[x,y].DoSomething();
        }
}

foreach を使用すると、コレクション内のすべてを反復処理してから、必要な座標範囲内にあるかどうかを確認する必要があります。

4

1 に答える 1

1

これが本当に必要なことである限り、2D配列を反復するための2つのループに問題はありません。注意すべきことの 1 つはパフォーマンスです。一般に、ループはメモリ内の配列のレイアウトに従う必要があります。たとえば、2D 配列が 1D メモリ バッファとして格納され、行nが次から次へと格納される場合n-1(これは汎用言語での一般的な実装です)、外部ループは行を通過し、内部ループは列を通過する必要があります。これにより、キャッシュ ミスが最小限に抑えられます。

一般に、他の方法と比較した配列アクセスの有効性は、特定の言語の実装に完全に依存します。通常、配列は最も基本的なデータ構造であり、アクセスが最も高速になります。ところで、辞書は配列概念の一般化です。

于 2013-02-08T22:40:27.313 に答える