我的代码如下:
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 exception
为i
。
如果我将i
的第二个循环值更改为0 and 20
,它的效果如何,那是怎么回事?
答案 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++)
将从数组中的第一个元素开始。