Jaxam Ответов: 3

Как инициализировать список объектов в массиве объектов


Чего мне не хватает для этого куска кода, чтобы он работал? Ток у меня есть ошибка во внутреннем цикле for. Ошибка заключается в следующем

An unhandled exception of type 'System.NullReferenceException' occurred in testXMLSerializer.exe

Additional information: Object reference not set to an instance of an object.



Код у меня такой:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    class Class6
    {
        static void Main (string[] args)
        {
            Author[] author = new Author[5];
            int bookCount = 3;
            for (int i = 0; i < author.Length; i++ )
            {
                for (int j = 0; j < bookCount; j++)
                {
                    author[i].book[j].Title = "book title";
                    author[i].book[j].Language = "book language";
                }
            }

                Console.Read();
        }

    }

    public class Author
    {
        public List<Book> book {get; set;} 
    }

    public class Book
    {
        public string Title {get; set;}
        public string Language {get;set;}
    }
}



В основном я хочу иметь массив авторов, и у каждого автора будет список книг. Спасибо

Что я уже пробовал:

Код компилируется, но не выполняется во время выполнения.

3 Ответов

Рейтинг:
19

Thomas Daniels

После этой строки:

Author[] author = new Author[5];

все элементы author являются null и не фактический экземпляр Author класс. Поэтому первое, что нужно сделать при входе в первый цикл, - это создать экземпляр Author и положить его в массив.

Другая проблема заключается в том, что при создании Author например, book член также null. Когда экземпляр Author создается, вы должны присвоить значение book собственность. Вы можете сделать это с помощью конструктора: Конструкторы (Руководство По Программированию На C# )[^]

Другая проблема заключается в том, что вы пытаетесь получить доступ к элементу author[i].book, но этот элемент еще не существует в индексе j Сначала вы должны добавить его.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Test
{
    class Class6
    {
        static void Main (string[] args)
        {
            Author[] author = new Author[5];
            int bookCount = 3;
            for (int i = 0; i < author.Length; i++ )
            {
                author[i] = new Author();
                for (int j = 0; j < bookCount; j++)
                {
                    author[i].book.Add(new Book());
                    author[i].book[j].Title = "book title";
                    author[i].book[j].Language = "book language";
                    // or, as a one-liner: author[i].book.Add(new Book() { Title = "book title", Language = "book language" });
                }
            }
 
            Console.Read();
        }
 
    }
 
    public class Author
    {
        public List<Book> book {get; set;}

        public Author()
        {
            book = new List<Book>();
        }
    }
 
    public class Book
    {
        public string Title {get; set;}
        public string Language {get;set;}
    }
}


Рейтинг:
1

Marcus Kramer

Мне не нравится работать с массивами при настройке новых элементов. Фреймворк имеет встроенную конструкцию List<t>, которая делает подобные вещи намного проще. Вам также не нужно беспокоиться о явном размере вашего массива.

List<author> authors = new List<author>();
int authorCount = 5;
int bookCount = 3;
for(int i = 0; i < authorCount; i++)
{
    var newAuthor = new Author();
    for (int j = 0; j < bookCount; j++)
    {
        newAuthor.book.Add(new Book{
            Title = "book title";
            Language = "book language";
        });
    }
    authors.Add(newAuthor);
}

Чтобы получить доступ к списку авторов в виде массива, все, что вам нужно вызвать, это authors.ToArray();


Рейтинг:
0

Dave Kreskowiak

Ваш код немного перепутан. Вы создали и массив, который может содержать 5 авторских объектов. Вы никогда не создавали эти авторские объекты. Сначала вы должны создать экземпляр Author и назначить его элементу в массиве.

Author[] author = new Author[5];
for(int i = 0...)
{
    // Create a new Author and add it to the array.
    Author newAuthor = new Author();
    author[i] = newAuthor;

    // Initialize the book collection in the new Author object.
    newAuthor.book = new List<book>();

    // Create a list of new books and add them to the Author's
    // book collection.
    for(int j = 0...)
    {
        // Create a new book...
        Book newBook = new Book();
        newBook.Title = "book title";
        newBook.Language = "book language";

        // Add it to the book collection for the current Author.
        newAuthor.book.Add(newBook);
    }
}


На самом деле это не самый эффективный способ представления ваших данных. Я воспринимаю это как выдержку, что вы пытаетесь узнать, как это работает.