2017-04-27 102 views
0

我想在列出所有電影的系統中開發此選項。列表genreList被創建並在另一個類中聲明爲private,並且在我的主程序中調用它。電影類C#:如何將另一個列表中的某些元素添加到另一個類中並打印出來?

部分:

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

但我有這和錯誤消息的包: 類型「System.ArgumentOutOfRangeException」未處理的異常出現在mscorlib.dll 其他信息:指數超出範圍。必須是非負數且小於集合的大小。

而這阻止了程序繼續到我需要的部分。

enter image description here

請告訴我該怎麼做!非常感謝你。

+0

您應該告訴我們您收到哪些錯誤消息。 –

+0

我可以確定你的'listAllMovies'方法中的索引用完了:)) –

+0

是的,我只是編輯了這個問題。你能幫我嗎? –

回答

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(); 

希望得到這個幫助。

+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。


對此的解決方案並不清楚,因爲我不太清楚你是如何建立電影和流派之間的關係。你的代碼中沒有任何地方可以建立特定電影與其所屬流派之間的直接關係。

  • 你似乎傳遞的所有類型列表進入電影構造。我希望你只通過適用的流派
  • 在你的Movie構造函數中,你絕對不會對你傳給它的genrelist做任何事情。
  • 儘管技術上不會導致問題,但您不應在每個電影類中存儲genreList。它爲每個Movie對象複製相同的數據;我認爲這表明你的電影和流派之間的關係設計得非常糟糕;這是你面臨的問題的核心。

要還爲您提供一個答案,我會假設你的電影包含List<Genre> Genres;其中每個GenreName屬性。

這看起來像你想要的;即使它與你目前的不符。

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)); 

    } 
+0

我在第一個代碼塊中包含了我的問題中Movie類的構造函數。我明白你在說什麼,只是將所有流派列表包含在一個或兩個元素中,但我該如何改變它?我認爲可能添加genreList [i]可能意味着該列表按索引在流派部分打印索引。 –

+0

如果'MovieList [i]'檢索位於'i'位置的數組內的'Movie'對象,則'genreList [i]'檢索位於數組內部的'genre'對象(在您的情況下爲字符串)陣列位置'我'。相同的語法;同樣的意思。 – Flater

+0

所以我認爲它會以相同的方式工作,並按順序依次打印出項目 –

相關問題