集合值在for循环中更改

kdm*_*ray 1 c# collections loops for-loop

我有一些代码,我过去几天一直在为朋友工作.在较高级别,它解析文本文件并写入MDB.简而言之,我有一对嵌套的循环对这些项目进行一些处理.内部循环仅在某些情况下被调用,但是当它发生时,它正在做一些奇怪的事情.

ArrayList CaseRecordItems = new ArrayList(); // this is created earlier
string baseTif = "sometext_"; // this is created earlier
CaseRecord cr = new CaseRecord(); (this gets populated with "stuff")
char increment = 'A';

for (int i = 0; i < FirstNames.Count; i++)
{
    cr.Firstname = (string)FirstNames[i];
    cr.Lastname = (string)LastNames[i];
    if (FirstNames.Count > 1)
    {
        cr.Tif = baseTif + increment.ToString();
        increment++;
    }
    CaseRecordItems.Add(cr);
}
Run Code Online (Sandbox Code Playgroud)

该循环运行两次,并应将cr.Tif的值设置为sometext_A和sometext_B.这可以正常工作,但是一旦将第二个项目添加到集合中,第一个项目的值就会更改为与之匹配.

我怀疑这是由于我不了解这些对象如何被实例化和传递.任何见解将不胜感激.

编辑:

基于令人敬畏的反馈(和我的麻木 - 坚果),问题已得到解决.感谢Dan的回答,我在使用克隆功能之前对我尝试过的代码进行了一些更改(是的,我实际尝试过的海滩:P).

新块看起来像这样:ArrayList CaseRecordItems = new ArrayList(); //这是先前创建的字符串baseTif ="sometext_"; //这是先前创建的CaseRecord cr = new CaseRecord(); //这会填充"stuff")char increment ='A';

for (int i = 0; i < FirstNames.Count; i++)
{
    CaseRecord cr2 = new CaseRecord();
    cr2 = cr.Clone();                        // preserves the data from outside
    cr2.Firstname = (string)FirstNames[i];
    cr2.Lastname = (string)LastNames[i];
    if (FirstNames.Count > 1)
    {
        cr2.Tif = baseTif + increment.ToString();
        increment++;
    }
    CaseRecordItems.Add(cr2);
}
Run Code Online (Sandbox Code Playgroud)

感谢大家的超快响应!

Dan*_*ler 7

我认为cr是一个对象.你不是每次都创建一个新的cr,所以你在arraylist中有两次相同的引用,因此当你第二次实际处理同一个对象时修改它.