Вложенная структура или класс хранятся в списке в C # - PullRequest
0 голосов
/ 21 января 2019

возможно ли хранить вложенные структуры или классы в списках с помощью c #?

смотрит на следующие сегменты кода.

Вложенный Scruct:

struct structBooks
{
    public string strBookName;
    public string strAuthor;
    public structPubished publishedDate;
}

struct structPubished
{
    public int intDayOfMonth;
    public int intMonthOfYear;
    public int intYear;
}

сохранение в виде списка:

  static void AddBookToList()
    {
        structBooks testStruct = new structBooks();
        testStruct.strBookName = newBookName;
        testStruct.strAuthor = newAuther;
        testStruct.publishedDate.intYear = intNewYear;
        testStruct.publishedDate.intMonthOfYear = intNewMonthOfYear;
        testStruct.publishedDate.intDayOfMonth = intNewDayOfMonth;

        static List<structBooks> listBooks = new List<structBooks>();
        listBooks.Add(new structBooks()
        {
            strBookName = newBookName,
            strAuthor = newAuther,
            publishedDate.intYear = intNewYear,
            publishedDate.intMonthOfYear = intNewMonthOfYear,
            publishedDate.intDayOfMonth = intNewDayOfMonth
        });
    }

создание всех работ testStruct, как и ожидалось.

Когда дело доходит до сохранения структуры в виде списка, оба strBookName и strAuthor работают. Однако, когда дело доходит до вложенной опубликованной даты, Visual Studio сообщает мне «недопустимый декларатор члена инициализатора».

список сам по себе определен в методе Main, я просто добавил его, чтобы вы могли видеть, как он определен.

что мне не хватает?

Ответы [ 5 ]

0 голосов
/ 21 января 2019

Вам необходимо использовать синтаксис инициализатора вложенных объектов .Обратите внимание, что для создания вложенной структуры не требуется ключевое слово new.

listBooks.Add
(
    new structBooks
    {
        strBookName = newBookName,
        strAuthor = newAuther,
        publishedDate = 
        {
            intYear = 2018, 
            intMonthOfYear = 1, 
            intDayOfMonth = 2 
        }
    }
);
0 голосов
/ 21 января 2019

Вам нужно инициализировать структуру, используя ключевое слово new

List<structBooks> listBooks = new List<structBooks>();
listBooks.Add(new structBooks()
{
    strBookName = "bookName",
    strAuthor = "author",
    publishedDate = new structPubished
      {
        intDayOfMonth = intNewDayOfMonth,
        intMonthOfYear = intNewMonthOfYear,
        intYear = intNewYear
      }
});

Надеюсь, вы также понимаете, что вам на самом деле не нужно создавать structPublished во-первых, и вы можете использовать встроенную сборку DateTime.

Это изменит ваши structBooks как

struct structBooks
{
    public string strBookName;
    public string strAuthor;
    public DateTime publishedDate;
}

и вы можете добавить как

List<structBooks> listBooks = new List<structBooks>();
  listBooks.Add(new structBooks()
  {
    strBookName = "bookName",
    strAuthor = "author",
    publishedDate = new DateTime(intNewYear,intNewMonthOfYear,intNewDayOfMonth)
  });

Встроенная DateTime структура предоставляет множество других функций, которые могут быть полезны для вашего приложения.

0 голосов
/ 21 января 2019

Изменить это:

testStruct.publishedDate.intYear = intNewYear;
testStruct.publishedDate.intMonthOfYear = intNewMonthOfYear;
testStruct.publishedDate.intDayOfMonth = intNewDayOfMonth;

к этому:

testStruct.publishedDate = new structPublished {
  intYear = intNewYear,
  intMonthOfYear = inNewMonthOfYear,
  intDayOfMonth = intNewDayOfMonth
};

Вы не можете инициализировать что-либо, устанавливая его поля или свойства - C # до сих пор не знает тип вещи, которую вы пытаетесь инициализировать. Вместо этого вам нужно использовать ключевое слово new, предназначенное для инициализации объектов.

0 голосов
/ 21 января 2019

Это правильная реализация:

    static void AddBookToList()
    {
        structBooks testStruct = new structBooks();
        testStruct.strBookName = newBookName;
        testStruct.strAuthor = newAuther;
        testStruct.publishedDate.intYear = intNewYear;
        testStruct.publishedDate.intMonthOfYear = intNewMonthOfYear;
        testStruct.publishedDate.intDayOfMonth = intNewDayOfMonth;

        List<structBooks> listBooks = new List<structBooks>();
        listBooks.Add(new structBooks()
        {
            strBookName = newBookName,
            strAuthor = newAuther,
            publishedDate = new structPubished()
            {
                intYear = intNewYear,
                intMonthOfYear = intNewMonthOfYear,
                intDayOfMonth = intNewDayOfMonth
            }
        });
    }

Разница между созданием testStruct и вставленным в список способом инициализации.

Когда вы делаете

structBooks testStruct = new structBooks();

он инициализирует каждый объект внутри, используя конструктор по умолчанию, поэтому вам не нужно вводить

testStruct.publishedDate = new structPubished();

по-другому, когда вы объявляете инициализацию, предоставляя значенияОбъект, вы должны указать все.

0 голосов
/ 21 января 2019

Используйте new для инициализации вашего опубликованногоDate struct, так же как вы делаете с structBooks.

  List<structBooks> listBooks = new List<structBooks>();
  listBooks.Add(new structBooks()
  {
    strBookName = "bookName",
    strAuthor = "author",
    publishedDate = new structPubished
      {
        intDayOfMonth = 1,
        intMonthOfYear = 1,
        intYear = 1000
      }
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...