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

时间:2017-04-27 10:08:19

标签: c#

我想在列出所有电影的系统中开发此选项。列表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的一部分中。输出应该是这样的:

enter image description here

但我所拥有的是一堆错误信息: mscorlib.dll中发生未处理的“System.ArgumentOutOfRangeException”类型异常 附加信息:指数超出范围。必须是非负数且小于集合的大小。

这阻止了程序继续我需要的部分。

enter image description here

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

2 个答案:

答案 0 :(得分:1)

您滥用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构造函数中,您从未对传递给它的genrelist做任何事情。
  • 虽然技术上不会导致问题,但您不应在每个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));

    }

答案 1 :(得分:1)

您的代码中存在一些问题,首先,在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();

希望得到这个帮助。