инициализация массива списка c # - PullRequest
0 голосов
/ 19 февраля 2012
List<authorinfo> aif = new List<authorinfo>();
for (int i = 0; i < 5; i++)
{
    aif.Add(null);
}
aif[0] = new authorinfo("The Count of Monte Cristo", "Alexandre", "Dumas", 1844);
aif[1] = new authorinfo("Rendezvous with Rama", "Arthur", "Clark", 1972);
aif[2] = new authorinfo("The Three Musketeers", "Alexandre", "Dumas", 1844);
aif[3] = new authorinfo("Robinson Crusoe", "Daniel", "Defoe", 1719);
aif[4] = new authorinfo("2001: A Space Odyssey", "Arthur", "Clark", 1968); 
//authorinfo ai = new authorinfo("The Count of Monte Cristo", "Alexandre", "Dumas", 1844); 
foreach (authorinfo i in aif)
{
    Console.WriteLine(i);
}

Хорошо, дело в том, что когда я убираю цикл for вверху, программа не запускается, почему?Потому что мне нужно добавить ноль в список.

Я знаю, что делаю это неправильно.Я просто хочу, чтобы aif [0-4] был там, не имеет смысла, что я должен добавлять нулевые объекты, чтобы не получить ошибку за пределами.

Помогите пожалуйста?

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Просто добавьте сами новые экземпляры объекта:

  List<authorinfo> aif = new List<authorinfo>();
  aif.Add(new authorinfo("The Count of Monte Cristo", "Alexandre", "Dumas", 1844));
  //... and so on

Прямо сейчас вы используете null в качестве элемента-заполнителя, который затем перезаписываете с помощью индексатора - вам не нужно этого делать (и не следует).

В качестве альтернативы, и если вы заранее знаете свои элементы списка, вы также можете использовать инициализатор коллекции :

  List<authorinfo> aif = new List<authorinfo>()
  {
     new authorinfo("The Count of Monte Cristo", "Alexandre", "Dumas", 1844),
     new authorinfo("Rendezvous with Rama", "Arthur", "Clark", 1972),
     new authorinfo("The Three Musketeers", "Alexandre", "Dumas", 1844)
  };
1 голос
/ 19 февраля 2012

Сделай так:

var aif = new List<authorinfo> {
        new authorinfo("The Count of Monte Cristo", "Alexandre", "Dumas", 1844),
        new authorinfo("Rendezvous with Rama", "Arthur", "Clark", 1972),
        new authorinfo("The Three Musketeers", "Alexandre", "Dumas", 1844),
        new authorinfo("Robinson Crusoe", "Daniel", "Defoe", 1719),
        new authorinfo("2001: A Space Odyssey", "Arthur", "Clark", 1968)
};

И вы сделали

0 голосов
/ 19 февраля 2012

Когда вы получаете доступ к элементу списка через индекс, например,

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. В массиве пространство для ссылок на все элементы выделяется заранее, поэтому вы можете сразу получить к ним доступ, но не можете динамически изменять размер массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...