2012-05-05 133 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; 
} 

現在,我已經嘗試訪問在以下兩個方面的報價和關鍵字,都已經產生錯誤:

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類型,因此,使用結構來承載所有這些信息使得它非常低效的,因爲每次你把它作爲一個參數結構的全部內容將需要時間來複制等一個更好的方法是使用一個類,它是一個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

是的,謝謝你,伊卡洛斯我已經能夠讀寫標題了。我的問題是我需要知道訪問報價和關鍵字。如果我們的老師不需要這些結構,我會用一堂課。行情和關鍵詞是我從閱讀和寫作時獲得錯誤的兩個字段。 – David

+0

@大衛檢查我的更新。這就是你如何訪問「報價單」。 – Icarus

+0

如果你在這裏,我會抱抱你伊卡洛斯。謝謝一堆。這是我第一次使用c#的內置列表類,我不熟悉這一點。對此,我真的非常感激。 :D – David

1

您的MovieList結構體包含一個數組Movie。該數組未被初始化。

爲什麼不直接製作List<Movie>而不是單獨的結構或類?

+0

我沒有放入所有的代碼,因爲它是一個很大的任務,但我已經初始化了這個數組。 'ML.movi​​e =新電影[MAX_MOVIES];' 我已經能夠輸入和輸出一切,但報價和關鍵字。 – David

0

感謝您對家庭作業的誠實。我看到的第一個問題是,您正嘗試在初始化之前使用列表。在結構中,全新列表引用爲空。你必須初始化它們。請做一個關於結構初始化的研究。

0

使這些類而不是結構。對於MovieList類中的每個電影,您都必須創建一個新的Movie實例,以便添加到引號列表中。否則它不會被初始化。

+0

感謝您的快速輸入。它必須位於此分配的結構中。我們的老師給了我們關於結構的一部分,他將根據這個給我們分級。沒有任何辦法嗎? – David

+0

好的。只需創建Movie array對象並創建引用列表的新實例即可。 –

0

結構一般應避免公開可變類類型的字段或屬性,除非結構將僅由僅感興趣的代碼使用其身份其中提到的對象,而不是他們的內容。假設有一個結構爲m1,其中包含有關某部電影的信息,而m2最初是空白的。如果一個執行代碼:

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

然後m1.year將保持不變,但m1.keywords將有「恐龍」添加到它(因爲m1.keywordsm2.keywords都指向同一個可變List<string>

對於用作數據持有者的結構來說,它公開了邏輯上不可變類類型的讀寫字段或者不包含任何可變類類型的值類型,但持有可變引用類型的結構通常具有結構奇怪的語義,應該避免在實際中使用。