【问题标题】:For loop iterations & array trouble对于循环迭代和数组问题
【发布时间】:2014-01-23 06:47:32
【问题描述】:

我正在尝试创建一个大约 5500 个团队列表,并使用此代码为列表的每个元素创建一个对象 Team我从一个教程中得到:

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

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

但我不断收到此错误:

System.IndexOutOfRangeException”类型的未处理异常 发生在 [我的程序].exe

附加信息:索引超出了数组的范围

在这个程序中,“Team”是一个自定义类,在创建时需要一个团队编号(...new Team([teamnumber]))。

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

...teams[y] = new Team(y);...

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

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

【问题讨论】:

  • 如果你真的想要一个数组,使用Team[] teams = new Team[5500];。但是您可以使用List&lt;Team&gt;,只需使用Add 方法将项目附加到您的列表中。请注意,List&lt;T&gt;T[] 的索引都是从 0N-1,而不是 1N
  • 我使用列表是因为我发现列表比普通数组更易于访问。谢谢大家的帮助!
  • 是的,列表通常更好。我误解了,因为您在标题中提到了“数组问题”,但我意识到这可能只是对异常消息的引用。 注意:如果你喜欢Linq,可以考虑var teams = Enumerable.Range(1, 5500).Select(y =&gt; new Team(y)).ToList();

标签: c# list for-loop foreach indexing


【解决方案1】:

您正在访问一个空的List&lt;&gt;,任何访问都会抛出这个异常。设置容量不会创建空条目。

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

【讨论】:

    【解决方案2】:

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

    您可以将 Capacity 增加到 5501,或使用 new Team(y+1)y 从 0 增加到 5499。

    此外,您可以通过使用不同的构造函数来摆脱设置容量的行:

    List<Team> teams = new List<Team>(5500);
    

    【讨论】:

      【解决方案3】:
      public Form1()
      {
          InitializeComponent();
          List<Team> teams = new List<Team>(5500);
      
          for (int y = 1; y < 5501; y++)
          {
              teams.Add(new Team(y));
          }
      }
      

      这会奏效。这是您初始化项目并将其添加到列表的方式。 需要注意的一件事是 y &lt; 5501y &lt;= 5500&lt;= 对性能有一点影响,因为这是 OR 运算符的条件。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-14
        • 1970-01-01
        • 2015-02-16
        • 2020-05-26
        • 2011-07-07
        • 2015-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多