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)

在索引这些之前,我正在执行检查,如您所见,以确保我没有得到 a 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

我尝试运行您的代码,我认为您可以获得您正在寻找的功能,将其简化为:

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]);
                }
            }
        }
    }

编辑 如果在这两种情况下也可以删除第二个,因为您已经测试过它们是否相等,但这并不重要,因为它不会改变结果。只会稍微提高性能

于 2013-08-06T07:45:15.650 回答
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
 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

看来您的 if 条件似乎不正确

尝试这个

 if (y < grid.Columns[x].Count - 1)
instead of 
 if (y != grid.Columns[x].Count - 1)
于 2013-08-06T07:15:06.680 回答
0

可能您的阵列是锯齿状的。并且各个子数组的长度不同。这可能是在以下位置获得 ArgumentOutOfRange-Exception 的原因:

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