我想在列出所有电影的系统中开发此选项。列表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”类型异常 附加信息:指数超出范围。必须是非负数且小于集合的大小。
这阻止了程序继续我需要的部分。
请告诉我该做什么!非常感谢你。
答案 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));
}
您使用相同的索引i
从MovieList
和genreList
获取内容。如果您的genrelist比movielist短,i
最终会变得足够大,以至于当您尝试检索genreList[i]
时会导致ArgumentOutOfRangeException。
对此的解决方案并不明确,因为我不太明白你是如何建立电影和流派之间的关系的。您的代码中没有任何地方可以在特定电影及其所属的类型之间建立直接关系。
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();
希望得到这个帮助。