繁体   English   中英

C#:如何从另一个类的另一个列表中添加某些元素并打印出来?

[英]C#: How to add certain elements from another list in another class and print out?

我想在列出所有电影的系统中开发此选项。 列表genreList在另一个类中创建并声明为私有,我在主程序中调用它。

电影课的一部分:

public List<string> genreList = new List<string>();
public Movie() { }
public Movie(string tt, int dur, string cls, DateTime opendt, List<string> genrelist)
    {
        Title = tt;
        Duration = dur;
        Classification = cls;
        OpeningDate = opendt;
    }

    //methods
    public List<string> GetGenreList()
    {
        return genreList;
    }

这是我的主程序中的代码:

List<Movie> MovieList = new List<Movie>();
        InitMovieList(MovieList);
if (option == 1)
            listAllMovies(MovieList);

static void getGenreList()
    {
        Movie moviegenre = new Movie();
        List<string> genreList = moviegenre.GetGenreList();

        genreList.Add("Action");
        genreList.Add("Adventure");
        genreList.Add("Comedy");
        genreList.Add("Fantasy");
        genreList.Add("Thriller");
    }

static void InitMovieList(List<Movie> MovieList)
    {
        Movie moviegenre = new Movie();
        List<string> genreList = moviegenre.GetGenreList();

        Movie m;

            m = new Movie("The Great Wall", 103, "NC16", Convert.ToDateTime("29-12-2016"), genreList);
            MovieList.Add(m);
        m = new Movie("Rogue One: A Star Wars Story", 134, "PG13", Convert.ToDateTime("15-12-2016"), genreList);
        MovieList.Add(m);
        m = new Movie("Office Christmas Party", 106, "M18", Convert.ToDateTime("15-01-2017"), genreList);
        m = new Movie("Power Rangers", 120, "G", Convert.ToDateTime("31-01-2017"), genreList);


    }

//list all movies
    static void listAllMovies(List<Movie> MovieList)
    {
        Movie moviegenre = new Movie();
        List<string> genreList = moviegenre.GetGenreList();
        Console.WriteLine();
        Console.WriteLine(string.Format("{0,-5}{1,-30}{2,-10}{3,-20}{4,-15}{5,-15}", "No","Title","Duration", "Genre", "Classification", "Opening Date"));

        for(int i = 0; i<MovieList.Count; i++)
        {
            Console.WriteLine(string.Format("{0,-5}{1,-30}{2,-10}{3,-20}{4,-15}{5,-15}", i + 1, MovieList[i].Title, MovieList[i].Duration, genreList[i], MovieList[i].Classification, MovieList[i].OpeningDate));

            Console.WriteLine();
            Console.Write("");
            Console.ReadLine();
        }
    }

我的问题是,我要在Movielist的一部分中加入某些元素,例如“动作,冒险”或“幻想,惊悚片”。 输出应该是这样的:

在此处输入图片说明

但是我所拥有的只是一堆错误消息:mscorlib.dll中发生了'System.ArgumentOutOfRangeException'类型的未处理异常。其他信息:索引超出范围。 必须为非负数并且小于集合的大小。

这就阻止了程序继续进行到我需要的部分。

在此处输入图片说明

请告诉我该怎么做! 非常感谢你。

您正在滥用listAllMovies的索引。 我对您的代码进行了重新格式化,以使其更容易发现:

for(int i = 0; i<MovieList.Count; i++)
    {
        Console.WriteLine(
               string.Format(
                   "yourformatstring", 
                   i + 1, 
                   MovieList[i].Title, 
                   MovieList[i].Duration, 
                   genreList[i],     //  <----THE PROBLEM IS HERE
                   MovieList[i].Classification,         
                   MovieList[i].OpeningDate));

    }

您正在使用相同的索引iMovieListgenreList获取项目。 如果您的genrelist短于movielist,那么i最终将变得足够大,以至于当您尝试检索genreList[i]时,它将导致ArgumentOutOfRangeException。


解决方案还不是很明确,因为我不太了解您如何设置电影和流派之间的关系。 您在代码中的任何地方都没有在特定电影与其所属类型之间建立直接关系。

  • 您似乎将所有类型的列表传递给Movie构造函数。 我希望您只通过适用的流派
  • 在Movie构造函数中,您永远不会对传递给它的流派列表做任何事情。
  • 从技术上讲,这不会引起问题,但您不应该在每个Movie类中存储genreList 它为每个Movie对象复制相同的数据; 我认为这表明您的电影和流派之间存在设计不良的关系; 这是您面临的问题的核心。

为了仍然为您提供答案,我将假设您的电影包含List<Genre> Genres; 每个Genre都有一个Name属性。

这似乎是您想要的; 即使它与您当前拥有的不匹配。

for(int i = 0; i<MovieList.Count; i++)
    {
        Console.WriteLine(
               string.Format(
                   "yourformatstring", 
                   i + 1, 
                   MovieList[i].Title, 
                   MovieList[i].Duration, 
                   String.Join(",", MovieList[i].Genres.Select(x => x.Name).ToList()),     //  <----THE FIX IS HERE
                   MovieList[i].Classification,         
                   MovieList[i].OpeningDate));

    }

您的代码中存在一些问题,首先,在Movie构造函数中,您应该添加以下行

this.genreList = genreList;

要将新电影添加到列表中:

Movie m = new Movie("The Great Wall", 103, "NC16", Convert.ToDateTime("29-12-2016"), new List<String>());
m.GetGenreList().Add("Action");
MovieList.Add(m);

并打印电影

for(int i = 0; i<MovieList.Count; i++)
{
      String genre = String.Join(",", MovieList[i].GetGenreList());
      Console.WriteLine(string.Format("{0,-5}{1,-30}{2,-10}{3,-20}{4,-15}{5,-15}", i + 1, MovieList[i].Title, MovieList[i].Duration, genre, MovieList[i].Classification, MovieList[i].OpeningDate));
      Console.WriteLine();
      Console.Write("");
      Console.ReadLine();
}

然后删除所有这些代码:

Movie moviegenre = new Movie();
List<string> genreList = moviegenre.GetGenreList();

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM