【问题标题】:Modify a List Inside of a Struct修改结构内的列表
【发布时间】:2012-05-05 17:43:31
【问题描述】:

我一直在为我在学校的 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);

【问题讨论】:

  • 你不希望 Movie 成为一个结构。让它成为一堂课。有关更多信息,请参阅here
  • 当你说它不起作用时,你的意思是你得到一个错误?

标签: c# arrays struct


【解决方案1】:

结构是Value 类型,因此,使用结构来承载所有这些信息会使其效率非常低,因为每次将其作为参数传递时,都需要复制结构的全部内容等. 更好的方法是使用 Class,它是 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

更新:

展示如何访问报价:

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

【讨论】:

  • 是的,谢谢你,Icarus 我已经能够阅读和写作标题了。我的问题是我需要知道访问引号和关键字。如果我们的老师不需要结构,我会使用一个类。引号和关键字是我在尝试读取和写入时遇到错误的两个字段。
  • 如果你在这里,我会拥抱你伊卡洛斯。谢谢一堆。这是我第一次使用 c# 的内置列表类,我对此并不熟悉。对此,我真的非常感激。 :D
  • 新建列表/数组的构造函数将大大简化这些结构的使用。
【解决方案2】:

您的MovieList 结构包含Movie 数组。数组未初始化。

为什么不直接创建 List&lt;Movie&gt; 而不是单独的结构或类?

【讨论】:

  • 我没有把所有的代码都放进去,因为这是一个很大的任务,但我已经初始化了数组。 ML.movie = new Movie[MAX_MOVIES];我已经能够输入和输出除引号和关键字之外的所有内容。
【解决方案3】:

感谢您诚实地完成作业。我看到的第一个问题是您试图在初始化之前使用列表。在结构内部,全新的列表引用了 null。你必须初始化它们。请研究一下结构初始化。

【讨论】:

    【解决方案4】:

    创建这些类而不是结构。对于 MovieList 类中的每一部电影,您都必须创建一个新的 Movie 实例,以便您可以添加到引号列表中。否则不会初始化。

    【讨论】:

    • 感谢您的快速输入。它必须在此分配的结构中。我们的老师给了我们关于结构的部分,他将根据这个给我们评分。没有办法吗?
    • 好的,当然。只需初始化 Movie 数组对象并创建引号列表的新实例。
    【解决方案5】:

    结构通常应该避免暴露可变类类型的字段或属性,除非结构将由仅对其中引用的对象的身份感兴趣的代码使用,而不是他们的内容。假设有一个结构m1,其中包含有关某部电影的信息,以及m2,最初是空白的。如果执行代码:

    m2 = m1; m2.年 = 2012; m2.keywords.Add("恐龙")

    然后m1.year 将不被修改,但m1.keywords 将添加“恐龙”(因为m1.keywordsm2.keywords 都引用相同的可变List&lt;string&gt;

    用作数据持有者的结构可以公开逻辑不可变类类型的读写字段,或不包含任何可变类类型的值类型,但持有可变引用类型的结构通常有奇怪的语义,应在实际情况下避免使用。

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多