我循环遍历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)
我仍然得到同样的错误。
FYI - 集合的大小始终相同。大小为:X = 5且Y = 10
答案 0 :(得分:1)
if (x != grid.Columns.Count - 1)
应该是
if (x < grid.Columns.Count - 1)
答案 1 :(得分: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++)
{
}
}
答案 2 :(得分: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]);
}
}
}
}
修改强> 也可以在两种情况下删除第二个if,因为你已经测试过它们是相等的,但并不重要,因为它不会改变结果。只会稍微改善性能
答案 3 :(得分:0)
似乎你的if条件似乎不正确
试试这个
if (y < grid.Columns[x].Count - 1)
instead of
if (y != grid.Columns[x].Count - 1)
答案 4 :(得分:0)
可能你的阵列是锯齿状的。并且各个子阵列的长度不同。 这可能是在以下情况下获得ArgumentOutOfRange-Exception的原因:
if (grid.Columns[x][y].Column == grid.Columns[x + 1][y].Column)
答案 5 :(得分:0)
为什么不使用foreach循环?那么你不会遇到数组越界的问题吗?除非你想要速度。您可以使用然后如上所述嵌套它们。
foreach (int key in values.Keys)
{
Console.WriteLine("{0} is assigned to key: {1}", values[key], key);
}