2012-05-05 131 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>

对于用作数据持有者的结构来说,它公开了逻辑上不可变类类型的读写字段或者不包含任何可变类类型的值类型,但持有可变引用类型的结构通常具有结构奇怪的语义,应该避免在实际中使用。