0

オブジェクトをループしてList<List<Shape>>、水平方向と垂直方向に隣接するオブジェクトが同じかどうかを確認しています。

        for (int x = 0; x < grid.Columns.Count; x++)
        {
            for (int y = 0; y < grid.Columns[x].Count; y++)
            {
                if (y != grid.Columns[x].Count - 1)
                {
                    if (grid.Columns[x][y].Column == grid.Columns[x][y + 1].Column)
                    {
                        if (!shapesToDestroy.Contains(grid.Columns[x][y]))
                        {
                            shapesToDestroy.Add(grid.Columns[x][y]);
                        }
                        if (!shapesToDestroy.Contains(grid.Columns[x][y + 1]))
                        {
                            shapesToDestroy.Add(grid.Columns[x][y + 1]);
                        }
                    }
                }

                if (x != grid.Columns.Count - 1)
                {
                    if (grid.Columns[x][y].Column == grid.Columns[x + 1][y].Column)
                    {
                        if (!shapesToDestroy.Contains(grid.Columns[x][y]))
                        {
                            shapesToDestroy.Add(grid.Columns[x][y]);
                        }
                        if (!shapesToDestroy.Contains(grid.Columns[x + 1][y]))
                        {
                            shapesToDestroy.Add(grid.Columns[x + 1][y]);
                        }
                    }
                }
            }
        }

ArgumentOutOfRangeしかし、私は常にオンになっているようです

if (grid.Columns[x][y].Column == grid.Columns[x][y + 1].Column)

if (grid.Columns[x][y].Column == grid.Columns[x + 1][y].Column)

これらにインデックスを付ける前に、ご覧のとおり、 が取得されていないことを確認するためにチェックを実行していますがArgumentOutOfRange、ここにあります。されているインデックスを見ると+ 1、コレクションのサイズを大きく下回っているように見えます。

明らかな間違いと、私がひどく間違っているところを誰かが見ることができますか?

更新 X と Y のチェックを次のように変更して、コードを更新しました。

if (x < grid.Columns.Count - 1)

if (y < grid.Columns[x].Count - 1)

それでも同じエラーが発生します。

参考までに - コレクションのサイズは常に同じです。サイズ: X = 5、Y = 10

4

6 に答える 6

1

y は 0 からリストの最大インデックスまで繰り返されるため、操作 grid.Columns[x][y + 1] は現在リストにあるものよりも高いインデックスを持つ要素にアクセスしようとします。上記のコードを保持したい場合は、ループを反復のみに変更する必要があります

for (int x = 0; x < grid.Columns.Count-1; x++)
{
     for (int y = 0; y < grid.Columns[x].Count-1; y++)
     {
     }
}
于 2013-08-06T07:17:15.630 に答える
1

コードを実行してみましたが、探している機能を次のように削除できると思います。

for (int x = 0; x < grid.Count; x++)
    {
        for (int y = 0; y < grid[x].Count; y++)
        {
            if (grid[x].Count > y && grid[x][y] == grid[x][y + 1])
            {
                if (!shapesToDestroy.Contains(grid[x][y]))
                {
                    shapesToDestroy.Add(grid[x][y]);
                }
                if (!shapesToDestroy.Contains(grid[x][y + 1]))
                {
                    shapesToDestroy.Add(grid[x][y + 1]);
                }
            }

            if (grid.Count > x && grid[x+1].Count > y && grid[x][y] == grid[x + 1][y])
            {
                if (!shapesToDestroy.Contains(grid[x][y]))
                {
                    shapesToDestroy.Add(grid[x][y]);
                }
                if (!shapesToDestroy.Contains(grid[x + 1][y]))
                {
                    shapesToDestroy.Add(grid[x + 1][y]);
                }
            }
        }
    }

編集 両方のケースで、それらが等しいことを既にテストしているため、2番目の場合も削除できますが、結果は変わらないため、実際には問題ではありません。パフォーマンスを少しだけ改善します

于 2013-08-06T07:45:15.650 に答える
1
 if (x != grid.Columns.Count - 1)

する必要があります

if (x < grid.Columns.Count - 1)
于 2013-08-06T07:10:43.503 に答える
0

foreach ループを使用しないのはなぜですか? 範囲外の配列に問題はありませんか?あなたがスピードを求めていない限り。上記のように使用してネストすることができます。

foreach (int key in values.Keys)
{
    Console.WriteLine("{0} is assigned to key: {1}", values[key], key);
}
于 2013-08-06T07:45:43.433 に答える
0

おそらくあなたの配列はギザギザです。また、個々のサブ配列の長さは同じではありません。これは、ArgumentOutOfRange-Exception を取得する理由である可能性があります。

if (grid.Columns[x][y].Column == grid.Columns[x + 1][y].Column)
于 2013-08-06T07:23:06.550 に答える