【问题标题】:Adding to list with foreach loop使用 foreach 循环添加到列表
【发布时间】:2016-11-16 14:56:00
【问题描述】:

我目前正在尝试添加对象(学生)。我在 foreach 循环中创建一个由学生组成的对象列表,每个列表对象最终都引用相同的位置,因此每个列表对象上的信息与循环结束时创建的最后一个学生对象相同。我能够找到的唯一信息是使用 foreach 循环状态将对象添加到列表中,以创建对象的新实例,我认为我正在使用 Student stud = new Student 行。

我也尝试过使用默认构造函数并使用属性而不是参数,然后将学生添加到列表中,但是我收到了相同的结果。

非常感谢使用 foreach 循环将对象添加到对象列表的任何帮助。

foreach 循环:

foreach (DataRow datrow in dt.Rows)
{
    Student stud = new Student(
        datrow["ID"].ToString(),
        datrow["fName"].ToString(),
        datrow["lName"].ToString(),
        datrow["GPA"].ToString(),
        datrow["Graduate"].ToString()
    );
    studentList.Add(stud);
}

我的学生构造函数:

public Student(
    string studentID,
    string fName,
    string lName,
    string studentGPA,
    string graduate)
{
    iD = studentID;
    firstName = fName;
    lastName = lName;
    gPA = studentGPA;
    grad = graduate;
}

用于填充 dt 的语句

                OleDbCommand cmd = new OleDbCommand(strSql, con);
                con.Open();
                cmd.CommandType = CommandType.Text;
                OleDbDataAdapter dc = new OleDbDataAdapter(cmd);
                dc.Fill(ds, "ID");
                dt = ds.Tables["ID"];
                const char DELIM = ',';
                foreach (DataRow datrow in dt.Rows)

每个对象引用并为每个新对象重写的“this”信息

结果

【问题讨论】:

  • 结果有什么问题?我的屏幕太小了,我无法制作图片的正面或反面。
  • 这段代码看起来是正确的。您如何确定问题出在此处而不是其他地方?
  • 另外,在第一个屏幕截图中,当您在构造函数的 第一行 上暂停时,如何填充 this 的值?这似乎很奇怪。
  • 您是否检查过这些行不都包含相同的信息?确定列表中的对象是否真的都相同或只是具有相同值的一种方法是右键单击并选择“生成对象 ID”。如果它们都是同一个对象,它们应该都得到相同的 id
  • Max,请包含用于填充dt 对象的语句或查询(例如Linq 或SQL)。如果所有对象都包含相同的数据,那么行也可能包含相同的数据。

标签: c# loops foreach


【解决方案1】:

您的私有变量很可能是静态的。这可以解释为什么变量在构造函数中已经有一个值(对于普通的实例变量它们不会)。您的属性正在返回静态值(这也解释了它们是如何具有值的)。将变量更改为实例(不是static

【讨论】:

  • 漂亮的水晶球 :o)
【解决方案2】:

您好,我的建议是尝试像这样在外部声明类变量,看看它是否有效

Student stud;

    foreach (DataRow datrow in dt.Rows)
    {
            stud = new Student(
            datrow["ID"].ToString(),
            datrow["fName"].ToString(),
            datrow["lName"].ToString(),
            datrow["GPA"].ToString(),
            datrow["Graduate"].ToString()
        );
        studentList.Add(stud);
    }

请告诉我你的建议。

谢谢 卡提克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 2015-06-24
    • 1970-01-01
    • 2013-09-04
    • 2018-05-27
    • 2012-12-28
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多