Когда вы получаете доступ к элементу списка через индекс, например,
var myObj = foo[4];
вы предполагаете, что коллекция foo
содержит как минимум пять (0,1,2,3,4) элементов. Вы получаете ошибку вне диапазона, потому что без цикла for
вы пытаетесь получить доступ к элементу, который не был выделен.
Есть несколько способов справиться с этим. Наиболее очевидным является использование List<>.Add()
:
List<authorinfo> aif = new List<authorinfo>();
aif.Add(new authorinfo("The Count of Monte Cristo", "Alexandre", "Dumas", 1844));
aif.Add(new authorinfo("Rendezvous with Rama", "Arthur", "Clark", 1972);
// ....
Для такой игрушки (домашней работы), как эта, вы можете просто инициализировать список при создании:
var authorList = new List<authorinfo>
{
new authorinfo("The Count of Monte Cristo", "Alexandre", "Dumas", 1844)
,new authorinfo("Rendezvous with Rama", "Arthur", "Clark", 1972)
, // .....
};
Одна из самых полезных вещей в List<>
и других коллекциях заключается в том, что они имеют динамический размер, а не массив. Подумайте о List<>
как о связанном списке, который обрабатывает все соединения узлов для вас. Как и связанный список, List<>
не имеет узлов, пока вы не добавите их, что делает ваш цикл for. В массиве пространство для ссылок на все элементы выделяется заранее, поэтому вы можете сразу получить к ним доступ, но не можете динамически изменять размер массива.