对于循环迭代&阵列麻烦

时间:2014-01-05 22:49:10

标签: c# list for-loop foreach indexing

我正在尝试制作一个关于 5500个团队列表,并为列表的每个元素创建一个对象团队这段代码来自一个教程:

    public Form1()
    {
        InitializeComponent();
        List<Team> teams = new List<Team>();
        teams.Capacity = 5500;            

        for (int y = 1; y <= 5500; y++)
        {
            teams[y] = new Team(y);
        }
    }

但我一直收到这个错误:

  

未处理的类型&#39; System.IndexOutOfRangeException &#39;   发生在[我的程序]。exe

     

其他信息:索引超出了数组范围

在此计划中,&#34; 团队&#34;是一个自定义类,在创建时需要一个团队编号(... new Team([teamnumber]))。

每个团队编号都是他们的唯一身份,因此必须与列表中的每个团队的索引相对应。

  

......球队[y] =新球队(y); ......

我要做的是确保为团队中的每个元素创建团队对象,这样我就不会这样做稍后在尝试将属性添加到某个元素时会遇到错误。此外,我不想要一个&#34;团队0&#34;,这就是为什么我在 1 开始 y 循环。我也尝试过使用 foreach 循环,但我得到了同样的错误。

我正在使用 Visual Studio 2012 Express 。这是一个用 C#编写的 Windows Presentation Forms 程序。

3 个答案:

答案 0 :(得分:4)

您正在访问空List<>,任何访问都会抛出此异常。设置容量将创建空条目。

var list = new List<int>(10); // Capacity = 10 but Count = 0
list[0] = 1; // out-of-range exception is thrown

在使用Add()

之前,您需要teams[index]个元素
for (int y = 1; y <= MAX_TEAMS; y++)
{
   teams.Add(new Team(y));  
}

答案 1 :(得分:1)

数组从零开始编制索引,因此teams[5500]是列表中第5501个元素。该列表的容量为5500,因此超出了范围。

您可以将Capacity增加到5501,或将new Team(y+1)从{0}用于0到5499.

此外,您可以使用不同的构造函数删除设置容量的行:

y

答案 2 :(得分:1)

public Form1()
{
    InitializeComponent();
    List<Team> teams = new List<Team>(5500);

    for (int y = 1; y < 5501; y++)
    {
        teams.Add(new Team(y));
    }
}

这会奏效。这是您初始化项目并将项目添加到列表的方式。 需要注意的一点是y < 5501 vs y <= 5500<=会受到一点性能影响,因为这是运营商的OR条件。

初始化列表的容量是一个好主意,因为它将导致更好的性能,因为列表不需要调整大小。