二维列表循环

时间:2013-08-06 07:07:31

标签: c# list for-loop

我循环遍历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

6 个答案:

答案 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);
}