[英]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));
}
您正在使用相同的索引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));
}
您的代码中存在一些问题,首先,在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.