C# Как провести oop через список и добавить строку в список? - PullRequest
0 голосов
/ 17 апреля 2020

я впервые задаю вопрос здесь. Могу ли я узнать, как l oop просмотреть список и добавить строку в список?

это мой код, и он провалился в модульном тесте.

using System;
using System.Collections.Generic;

namespace ItemTracker
{
    public class Book: Item
    {
        private List<string> _authors;
        private string _title;
        private int _yearPublished; 

        public Book(string id, double price, Category category, List<string> authors, string title, int 
                   yearPublished):base(id, price, category)
        {
            _authors = new List<string>();
            _authors = authors;
            foreach (string a in _authors)
            {
                _authors.Add(a);
            }
            _title = title;
            _yearPublished = yearPublished;
        }

        public List<string> Authors
        {
            get {return _authors;}
            set { _authors = value;}
        }

        public override string View() 
        {
            return "Author:" + _authors + "\nTitle:" + _title + "\nYear Published:" + _yearPublished;
        }
    }
}

это мой модульный тест:

    [Test()]
    public void TestBook() 
    {
        List<string> a = new List<string>();
        a.Add("J.K. Rowling");
        Book book = new Book("B1001", 39.9, Category.Book, a,"Harry Potter", 1997);
        Assert.IsTrue(book.View() == "Author: J.K. Rowling" + "\nTitle: Harry Potter" + "\nYear 
               Published: 1997");
    }

Ответы [ 2 ]

4 голосов
/ 17 апреля 2020

Вы печатаете имя объекта List<string>, а не имена authors. Это одна из причин, по которой ваш модульный тест не проходит. Попробуйте вместо этого.

    public override string View() 
    {
        var allAuthors = string.Join( " ", _authors );
        return "Author: " + allAuthors + "\nTitle: " + _title + "\nYear Published: " + _yearPublished;
    }

Как и другие отмечали, вы должны удалить этот l oop из вашего ctor и просто использовать:

_authors = authors;

Или, если хотите копия:

_authors = new List<string>( authors );

Не нужно l oop .. Это также должно помешать вам получить InvalidOperationException, так как вы изменяете List<string>, в то время как iterating через него.

Кроме того, вы делаете прямое сравнение строки, которая является хрупкой. Если вы добавите дополнительный пробел где-нибудь, сравнение string не удастся ..

1 голос
/ 17 апреля 2020

По поводу конструктора. Если вы хотите l oop через параметр авторов и добавить каждую запись в личный список _authors, просто удалите _authors = authors;
и l oop до authors, а не _authors.
Например:

public Book(string id, double price, Category category, List<string> authors, string title, int yearPublished) : base(id, price, category)
        {
            _authors = new List<string>();
            foreach (string a in authors)
            {
                _authors.Add(a);
            }
            _title = title;
            _yearPublished = yearPublished;
        }

Кроме того, метод View() не возвращает строку, которую вы ожидаете получить.
Он просто использует метод ToString(), полученный из object класса.
Так что вам нужно явно l oop - _authors перечислите и сначала создайте строку:

        public override string View() 
        {
            string authorString = "";
            foreach(var a in _authors)
            {
               authorString += $"{a} ";
            }
            return "Author:" + authorString + "\nTitle:" + _title + "\nYear Published:" + _yearPublished;
        }

или создайте свой собственный класс Authors с помощью ToString(), реализованным по-вашему.

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