为什么争论超出范围?

时间:2012-02-01 19:50:08

标签: c# list

我的代码如下:

for(int i=1; i < 21; i++)
{
    list.Add(random.Next(100));
}

for(int i=1; i < 21; i++)
{
    Console.Write(list[i] + ", ");
}

但我得到的Argument out of range exceptioni

如果我将i的第二个循环值更改为0 and 20,它的效果如何,那是怎么回事?

7 个答案:

答案 0 :(得分:16)

当您构建列表时,您将添加20个项目。

但是,列表是0索引的。

当你说list[1]时,你实际上正在获取列表中的第二个元素。所以list[20]实际上是元素21,它不存在。

答案 1 :(得分:3)

你的第一个循环插入20个元素,索引为0到19.在你的第二个循环中,你尝试使用1到20的索引值来访问它们。

答案 2 :(得分:2)

因为索引是从零开始的。在第一个循环中,您只是将元素添加到列表的最后位置(不需要索引),但在第二个循环中,您通过索引访问它们,该索引应为0-19;因此你的循环应该是:

for(int i=1; i < 21; i++)
{
    Console.Write(list[i-1] + ", ");
}

如果你想在1开始你的循环。

答案 3 :(得分:2)

前7个答案都是正确的。列表从0开始,这导致您的问题(列表[20]不存在)。如果可以,您应该考虑使用foreach循环而不是直接索引列表。

答案 4 :(得分:1)

因为你的循环错了。

你的第一个循环会在列表中添加20个元素,从索引0开始到索引19结束。从i = 1开始到21结束的事实无关紧要,因为你没有设置索引,而是附加到列表的末尾。

你的第二个循环尝试读取第1到第20个缺点。好吧,20不会退出,所以你得到一个例外。

'正确'版本是

for( int i = 0; i < 20; ++i )
{
    Console.Write(list[i] + ", ");
}

但即便如此,因为你根本不应该对边界进行硬编码;只要问清单有多大:

for( int i = 0; i < list.Count; ++i )
{
    Console.Write(list[i] + ", ");
}

保证不会超出清单,但更好;使用foreach:

foreach( var item in list )
{
    Console.Write(item + ", ");
}

你的第一个循环显示缺乏理解。如果要向列表中添加20个元素,请按以下方式构建列表:

for( int i = 0; i < 20; ++ )
{
    // add to list
}

当然你也可以写

for( int i = 121; i < 141; ++ )
{
    // add to list
}

但这只是令人困惑;)

答案 5 :(得分:1)

因为即使您的第一个循环使用了1 - 21,您的列表或数组仍然以0开头,索引为0

答案 6 :(得分:1)

在你的第二个for循环中,我从1开始,这是你数组中的第二个元素。将值更改为for(int i=0; i < 20; i++)将从数组中的第一个元素开始。