2014-01-05 3 views
0

Я пытаюсь сделать список около 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); 
     } 
    } 

Но я получаю эту ошибку:

An unhandled exception of type 'System.IndexOutOfRangeException' occurred in [my program].exe

Additional information: Index was outside the bounds of the array.

В этой программе "Team" является пользовательский класс для которого требуется номер команды при создании (... новая команда ([номер команды])).

Каждый номер команды - это их уникальная идентификация, поэтому это должно соответствовать индексу каждой команды в списке.

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

То, что я пытаюсь сделать, это убедиться, что есть Team объект создается для каждого элемента в команд так, что я не впадать в ошибки позже при попытке добавить атрибут в определенный элемент. Кроме того, я не хочу «Team 0», поэтому я начал у по адресу в для цикл. Я также пробовал использовать цикл foreach, но я получаю ту же ошибку.

Я использую Visual Studio 2012 Express. Это Windows Presentation Forms программа написана на C#.

+0

Если вам действительно нужен массив, используйте команду «Команда [] teams = new Team [5500];'. Но вы можете использовать «Список », просто используйте метод «Добавить», чтобы добавить элементы в свой список. Обратите внимание, что оба «Список » и «T []' индексируются от «0» до «N-1», а не «1» через «N». –

+0

Я использовал список, потому что я нахожу списки более доступными, чем обычные массивы. Спасибо за вашу помощь! – xProg660

+0

Да, списки, как правило, лучше. Я неправильно понял, потому что вы упомянули «проблема с массивом» в заголовке, но я понимаю, что это может быть просто ссылка на сообщение об исключении. ** Примечание: ** Если вам нравится Linq, вы можете рассмотреть «var commands = Enumerable.Range (1, 5500). Выберите (y => новая команда (y)). ToList();'. –

ответ

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

Спасибо! Это здорово! – xProg660

1

Массивы индексируются начиная с нуля, поэтому teams[5500] является 5501-м элементом списка. Список имеет емкость 5500, поэтому он выходит за пределы допустимого диапазона.

Вы можете увеличить Capacity до 5501, или использовать new Team(y+1) для y от 0 до 5499.

Кроме того, вы можете избавиться от линии, где вы установите емкость с помощью другого конструктора:

List<Team> teams = new List<Team>(5500); 
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 состояние оператора.

Инициализация емкости списка является хорошей идеей, поскольку она приведет к повышению производительности, поскольку для изменения списка не потребуется изменять размер.

Смежные вопросы