2012-05-05 12 views
1

私は学校で私のC#クラスのプロジェクトに取り組んでいます。私は非常に簡単な質問をしています。しかし、私はどこでも答えを見つけることができませんでした。私は構造体のリストを作る方法に関する結果を得ています。私は構造体内のリストにアクセスする方法を知りたいですか?構造体内部のリストを変更する

だからここに私たちの先生で、私たちはこの割り当てのため必見使用することを私たちに与えられた構造体である:

[Serializable] 
struct Name 
{ 
    public string firstName; 
    public string lastName; 
} 

[Serializable] 
struct Movie 
{ 
    public string title; 
    public string year; 
    public Name director; 
    public float quality; 
    public string mpaaRating; 
    public string genre; 
    public List<Name> cast; 
    public List<string> quotes; 
    public List<string> keywords; 
} 

struct MovieList 
{ 
    public int length; 
    public Movie[] movie; 
} 

今、私は、次の2つの方法で引用符やキーワードにアクセスしようとしたとの両方を生産しているが、エラー:

1.

string quotes; 
MovieList ML = new MovieList(); 

quotes = Console.ReadLine(); 
ML.movie[0].quotes[0] = quotes; 

2.

string quotes; 
MovieList ML = new MovieList(); 

quotes = Console.ReadLine(); 
ML.movie[0].quotes.Add(quotes); 
+1

ムービーを構造体にしたくありません。それをクラスにする。詳細については、[ここ](http://msdn.microsoft.com/en-us/library/ms229017.aspx)を参照してください。 –

+0

それがうまくいかないと言ったら、エラーが出るのですか? –

答えて

2

構造体がValue型であるため、この情報をすべて保持するために構造体を使用すると、引数として渡すたびにstructの内容全体がコピーされるなどの理由で非常に非効率的になります。より良いアプローチは、Referenceタイプのクラスを使用することであり、その参照は渡されるものです。

は限り、あなたの構造体のメンバにアクセスする方法として、ここでの例です:

MovieList m =new MovieList(); 
m.movie = new Movie[10]; 
m.movie[0].title="The Girl with the Dragon Tatoo"; 
Console.WriteLine(m.movie[0].title); //The Girl with the Dragon Tatoo 

UPDATE:

は引用符にアクセスする方法を表示:

MovieList m =new MovieList(); 
m.movie = new Movie[10]; 
m.movie[0].title="The Girl with the Dragon Tatoo"; 
m.movie[0].quotes = new List<string>(); 
m.movie[0].quotes.Add("Hello World"); 
Console.WriteLine(m.movie[0].title); //The Girl with the Dragon Tatoo 

Console.WriteLine(m.movie[0].quotes[0]); //Hello World 
+0

ありがとう、イカルス私はタイトルを読み書きすることができました。私の問題は、引用符とキーワードにアクセスするために知る必要があることです。私の先生が構造体を必要としない場合、私はクラスを使用していました。引用符とキーワードは、私がそれらから読み書きしようとするとエラーが発生する2つのフィールドです。 – David

+0

@Davidは私の更新をチェックします。それはあなたが "引用符"にアクセスする方法です。 – Icarus

+0

あなたがここにいるなら、イカルスを抱きしめるでしょう。本当にありがとう。これは、リストクラスで構築されたC#を使用して初めてのことであり、私はそれに精通していませんでした。ほんとうにありがとう。 :D – David

1

MovieList構造体には、Movieの配列が含まれています。配列が初期化されていません。

別の構造体またはクラスの代わりにList<Movie>を作成するだけではどうですか?

+0

大きな割り当てなので、私はすべてのコードを入れませんでしたが、配列を初期化しました。 'ML.movi​​e = new Movie [MAX_MOVIES];' 私は引用符とキーワード以外のすべてから入出力できました。 – David

0

あなたの宿題について正直でありがとうございます。最初の問題は、リストを初期化する前にリストを使用しようとしていることです。構造内では、真新しいリストがnullを参照しています。それらを初期化する必要があります。構造体の初期化についての研究をしてください。

0

これらのクラスを構造体ではなく作成します。 MovieListクラスのすべてのムービーについて、ムービーの新しいインスタンスを作成して、クォートリストに追加する必要があります。それ以外の場合は、初期化されません。

+0

迅速な入力をありがとう。この割り当てのための構造体になければなりません。私たちの先生は、構造体についての部分を私たちに与えてくれました。何か方法はありませんか? – David

+0

よろしいですか。 Movie配列オブジェクトを初期化し、引用符リストの新しいインスタンスを作成するだけです。 –

0

構造は、一般的に避けるべきです単に関心のあるコードによって構造体が使用される場合を除いて、変更可能なクラス型のフィールドまたはプロパティを公開するの内容ではなく、の同一性で示されている。ムービーに関する情報を含むm1という構造体と、最初は空白のm2という構造体があるとします。一つはコード実行の場合:

 
    m2 = m1; 
    m2.year = 2012; 
    m2.keywords.Add("dinosaur") 

を次にm1.yearは未修飾であるが、m1.keywordsは「恐竜」を有することになるm1.keywordsm2.keywords両方が同じ可変List<string>を参照するため(それに添加しました。

データ保持者として使用される構造体は、論理的に変更不可能なクラス型の読み書き可能フィールドや、変更可能なクラス型を持たない値型を公開しても問題ありませんが、奇妙な意味論であり、実用的には避けるべきである。

関連する問題