2017-04-27 1 views
0

すべての映画をリストするシステムでこのオプションを開発したいと思います。リストgenreListが作成され、別のクラスでプライベート宣言され、私は私のメインプログラムで呼び出しています。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)); 

    } 

あなたのMovieListとあなたのgenreListの両方から項目を取得するために同じインデックスiを使用しています。あなたのジャンルリストがあなたのmovielistよりも短い場合、iは最終的にはgenreList[i]を検索しようとするとArgumentOutOfRangeExceptionを引き起こすほど大きくなります。


映画とジャンルの関係をどのように設定しているのか分かりませんので、これに対する解決方法は明確ではありません。あなたのコードのどこにも、特定のムービーとそのムービーが属するジャンルとの間に直接の関係はありません。

  • あなたは作品のコンストラクタにすべてジャンルのリストを渡しているように見えます。該当するジャンルのみを渡すことを期待しています
  • あなたのMovieコンストラクタでは、渡されたgenrelistで決して何もしません。
  • 技術的には問題は発生しませんが、各ムービークラスにはgenreListを保存しないでください。すべてのMovieオブジェクトに対して同じデータを複製します。私はあなたの映画とジャンルとの間のひどく設計された関係を示していると思います。それはあなたが直面している問題の核心です。まだ答えを提供するために

、私はあなたの作品がそれぞれGenreName性質を持っているList<Genre> Genres;が含まれていると仮定するつもりです。

これはあなたの望むようです。あなたが現在持っているものと一致しないにも関わらず。

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クラスのコンストラクタを含めました。 1つか2つの要素の代わりにジャンルのリスト全体を含めることについてあなたが言っていることを理解していますが、どのように変更するのですか?私はgenreList [i]を追加すると、リストがジャンル別のインデックスでインデックスを印刷している可能性があると考えました。 –

+0

'MovieList [i]'が 'i 'の位置にある配列の中にある' Movie'オブジェクトを取得すると、 'genreList [i]'は、 'genre'オブジェクト(あなたの場合は文字列)を配列は位置iにある。同じ構文です。同じ意味。 – Flater

+0

だから私はそれが同じように働いていたと思って、シーケンスに従って項目を一つずつ印刷してください –

関連する問題