【问题标题】:How to populate a List that's within a class in C#?如何填充 C# 类中的列表?
【发布时间】:2018-03-11 11:45:12
【问题描述】:

我正在尝试理解嵌套类型,但即使在检查了几个站点之后我仍然不明白。我有一个在课堂上的列表。我看不到如何将新项目添加到列表中,因为当我尝试时,它会用我的新项目覆盖现有项目。谁能告诉我我做错了什么?

class Program
{
    static void Main(string[] args)
    {
        Master master = new Master();
        master.Username = "Barry";

        Quiz quiz = new Quiz();
        quiz.QuizID = "quiz ID";
        master.quiz = quiz;

        Answers answers = new Answers();
        answers.Answer1 = "answer 1";
        answers.Answer2 = "answer 2";
        answers.Answer3 = "answer 3";
        master.quiz.answers.Add(answers);
        answers.Answer1 = "answer 11";
        answers.Answer2 = "answer 22";
        answers.Answer3 = "answer 33";
        master.quiz.answers.Add(answers);
    }
}

public class Answers
{
    public string Answer1 { get; set; }
    public string Answer2 { get; set; }
    public string Answer3 { get; set; }
}

public class Quiz
{
    public string QuizID { get; set; }
    public List<Answers> answers = new List<Answers>();
}

public class Master
{
    public string Username { get; set; }
    public Quiz quiz { get; set; }
}

当我执行第二个 .Add 然后检查 master.quiz.answers 中的内容时,它显示了两个条目,但它们都是 11、22、33 值,就好像第二个 .Add 覆盖了列表中已经存在的数据.

谢谢。

【问题讨论】:

  • 在循环中移动声明以在循环的每次传递中获取一个新对象,目前您正在为旧值分配新值并且正在发生覆盖,您需要在每个新答案上使用 new 关键字对象与他自己的答案 1,2 和 3,通过说答案 1 = 10,答案 1 = 60,您将用新值 (60) 覆盖旧值 (10)。
  • 是的,因为您将 same 对象添加到集合中两次。尝试比较master.quiz.answers[0] == master.quiz.answers[1],你会发现它会返回true,因为两个引用都指向同一个对象

标签: c# list class


【解决方案1】:

您需要使用 new 运算符构造两个不同的对象。

Answers answers = new Answers();
        answers.Answer1 = "answer 1";
        answers.Answer2 = "answer 2";
        answers.Answer3 = "answer 3";
        master.quiz.answers.Add(answers);

Answers anotherAnswer = new Answers(); // construct a new object here
        anotherAnswer.Answer1 = "answer 11";
        anotherAnswer.Answer2 = "answer 22";
        anotherAnswer.Answer3 = "answer 33";
        master.quiz.answers.Add(anotherAnswer);

顺便说一句,您可以使用对象初始值设定项语法使其更简洁:

Answers answers = new Answers
{
      Answer1 = "answer 1",
      Answer2 = "answer 2",
      Answer3 = "answer 3"
};
master.quiz.answers.Add(answers);

Answers anotherAnswer = new Answers
{
      Answer1 = "answer 11",
      Answer2 = "answer 22",
      Answer3 = "answer 33"
}; 
master.quiz.answers.Add(anotherAnswer);

【讨论】:

    【解决方案2】:

    在第二次将其添加到测验之前尝试再次实例化答案对象。

    answers = new Answers();

    【讨论】:

      【解决方案3】:

      因为您正在更新同一个对象。 使用

       answers = new Answers();
      

      将对象添加到列表后

      【讨论】:

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