Добавление записи в ArrayList () с использованием конструктора не по умолчанию - PullRequest
1 голос
/ 27 октября 2011

Я пытаюсь сохранить данные в ArrayList (), используя следующий код в приложении WinForm. Проблема в том, что когда я делаю это, мой вывод в bookList.txtBookList.Text равен Lab_8.Book, и я не могу понять, почему. Надеюсь на несколько советов.

BookEntry.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace Lab_8
{
    public partial class BookEntry : Form
    {
        private ArrayList books = new ArrayList();
        private BookList bookList = new BookList();

        public BookEntry()
        {
            InitializeComponent();
        }

        private void btnEnter_Click(object sender, EventArgs e)
        {
            books.Add(new Book(txtTitle.Text, txtFirstName.Text, 
                txtLastName.Text, txtPublisher.Text, 
                float.Parse(txtPrice.Text)));
        }

        private void btnShowBooks_Click(object sender, EventArgs e)
        {
            foreach (object list in books)
            {
                bookList.txtBookList.Text += list.ToString() + "\n";
            }

            bookList.ShowDialog();
        }
    }
}

Book.cs

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

namespace Lab_8
{
    class Book : Publication
    {
        private string authorFirstName, authorLastName;

        public Book()
        { }

        public Book(string title, string firstName, string lastName, string publisherName, float price)
        : base(title, publisherName, price)
        {
            this.authorFirstName = firstName;
            this.authorLastName = lastName;
        } 

        public string getAuthorName()
        {
            return authorFirstName + " " + authorLastName;
        }

        public string AuthorFirstName
        {
            get
            {
                return authorFirstName;
            }
            set
            {
                authorFirstName = value;
            }
        }
        public string AuthorLastName
        {
            get
            {
                return authorLastName;
            }
            set
            {
                authorLastName = value;
            }
        }
    }
}

С уважением. HelpNeeder

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Проблема в том, что Book не переопределяет ToString, что означает этот цикл:

foreach (object list in books)
{
  bookList.txtBookList.Text += list.ToString() + "\n";
}

Просто распечатает имя класса (с пространством имен) или Lab_8.Book.

Чтобы исправить это, вы можете переопределить ToString() в Book:

class Book : Publication
{
   // .. Your code...

   public override string ToString()
   {
       return this.Title + " by " + this.AuthorFirstName + " " + this.AuthorLastName;
   }

При этом я настоятельно рекомендую преобразовать ArrayList для использования List<Book>. Это позволит вам ссылаться на книги как на книгу, то есть:

foreach (Book book in books)
{
  bookList.txtBookList.Text += book.AuthorFirstName + Environment.NewLine;
}

Единственное изменение, необходимое для этого, должно измениться:

private ArrayList books = new ArrayList();

Кому:

private List<Book> books = new List<Book>();

А затем также измените список, как указано выше ...

1 голос
/ 27 октября 2011

Вы должны преобразовать свой ArrayList в список.

Тогда у вас будет строго типизированный List из Book и все преимущества интерфейса IEnumerable Это сделает ваш код намного проще для чтения.

Потому что у вас есть

foreach (object book in books)

Это будет реализация по умолчанию ToString(), потому что book равен System.Object. Вызов System.Object.ToString() вернет имя класса. В этом случае Lab_8.Book.

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