Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么争论超出了范围?_C#_List - Fatal编程技术网

C# 为什么争论超出了范围?

C# 为什么争论超出了范围?,c#,list,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] + ", "); } for(int i=1;i

我的代码如下:

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

for(int i=1; i < 21; i++)
{
    Console.Write(list[i] + ", ");
}
for(int i=1;i<21;i++)
{
list.Add(random.Next(100));
}
对于(int i=1;i<21;i++)
{
Console.Write(列表[i]+“,”);
}
但是,我得到了一个
参数超出范围的异常
I


如果我将
I
的第二个循环值更改为
0和20
,它会正常工作,这是怎么回事?

因为您的循环是错误的

第一个循环向列表中添加20个元素,从索引0开始,到索引19结束。从
i=1
开始到
21
结束这一事实与此无关,因为您不是按索引设置的,而是附加到列表的末尾

第二个循环尝试读取索引1到20。20不存在,所以你得到一个例外

“正确”的版本是

for( int i = 0; i < 20; ++i )
{
    Console.Write(list[i] + ", ");
}
您的第一个循环表明您缺乏理解。如果要向列表中添加20个元素,请按如下方式构造列表:

for( int i = 0; i < 20; ++ )
{
    // add to list
}
for(int i=0;i<20;++)
{
//添加到列表中
}
当然你也可以写

for( int i = 121; i < 141; ++ )
{
    // add to list
}
for(int i=121;i<141;++)
{
//添加到列表中
}

但这只是令人困惑;)

在创建列表时,需要添加20项

但是,列表是0索引的


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

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

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

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

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

for(int i=1; i < 21; i++)
{
    Console.Write(list[i-1] + ", ");
}
for(int i=1;i<21;i++)
{
控制台。写入(列表[i-1]+“,”);
}

如果您想从1开始循环。

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

我建议只使用0索引访问,而不是这样做,即使它是有效的。@ Servy,我完全同意您的意见。我只是在演示如果OP坚持在1开始他的循环,为了让它工作,需要做些什么。在循环中使用list.Count作为上限将使它变得更好。如果第一个循环索引假设成立,这将是一个很好的答案correct@Jake:是的,我正在快速打字,试图在。。。修正了。十亿个答案都解释了你做错了什么。不过,您可能值得花时间搜索“为什么数组0被索引”以查看解释其背后原因的大量信息。
for( int i = 121; i < 141; ++ )
{
    // add to list
}
for(int i=1; i < 21; i++)
{
    Console.Write(list[i-1] + ", ");
}