C#如何遍历列表并将字符串添加到列表中?

时间:2020-04-17 10:43:28

标签: c# list xamarin

这是我第一次在这里发布问题。我可以知道如何遍历列表并将字符串添加到列表中吗?

这是我的代码,在单元测试中失败。

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 个答案:

答案 0 :(得分:4)

您正在打印对象名称List<string>,而不是authors的名称。这是单元测试失败的原因之一。试试这个吧。

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

正如其他人也指出的那样,您应该从ctor中删除该循环,而只需使用:

_authors = authors;

或者,如果您想要副本:

_authors = new List<string>( authors );

无需循环。这也应该阻止您获得InvalidOperationException,因为您正在List<string>期间修改iterating

此外,您正在直接比较脆的字符串。如果在string比较处添加额外的空间,则会失败。.

答案 1 :(得分:1)

关于构造函数。 如果要遍历authors参数并将每个条目添加到 _authors私有列表仅删除_authors = authors;
并遍历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方法。
因此,您需要显式遍历_authors列表并首先构建字符串:

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

或使用自己实现的Authors构建自己的ToString()类。