C# 在for循环中更改集合值

C# 在for循环中更改集合值,c#,collections,loops,for-loop,C#,Collections,Loops,For Loop,我有一段代码,过去几天我一直在为一位朋友编写。在高层,它解析文本文件并写入MDB。长话短说,我有一对嵌套的循环对这些项进行处理。内部循环只在某些情况下被调用,但当它被调用时,它会做一些奇怪的事情 ArrayList CaseRecordItems = new ArrayList(); // this is created earlier string baseTif = "sometext_"; // this is created earlier CaseRecord cr = new Cas

我有一段代码,过去几天我一直在为一位朋友编写。在高层,它解析文本文件并写入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);
}
ArrayList CaseRecordItems=new ArrayList();//这是先前创建的
string baseTif=“sometext”//这是先前创建的
案例记录cr=新案例记录();(这里填充了“东西”)
字符增量='A';
for(int i=0;i1)
{
cr.Tif=baseTif+increment.ToString();
增量++;
}
案例记录项目。添加(cr);
}
例如,循环运行两次,并应将cr.Tif的值设置为sometext_A和sometext_B。这可以正常工作,但一旦将第二个项添加到集合中,第一个项的值将更改为与之匹配

我怀疑这是因为我不了解这些对象是如何被实例化和传递的。如有任何见解,将不胜感激

编辑:

基于令人敬畏的反馈(和我的麻木疯子),问题已经解决了。多亏了Dan的回答,我对使用克隆功能之前尝试过的代码做了几处修改(是的,我确实尝试过:P)

新块如下所示: ArrayList CaseRecordItems=新建ArrayList();//这是先前创建的 string baseTif=“sometext”//这是先前创建的 CaseRecord cr=新CaseRecord();//这里填充了“东西”) 字符增量='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);
}
for(int i=0;i1)
{
cr2.Tif=baseTif+increment.ToString();
增量++;
}
案例记录项目。添加(cr2);
}

谢谢大家的快速回复

我假设cr是一个对象。您并不是每次都创建一个新的cr,因此您在arraylist中有两次相同的引用,因此当您第二次修改它时,您实际上正在处理同一个对象。

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

因为cr没有得到一个新的语句(我不知道cr的类型,或者我会向你展示),你只是一次又一次地添加相同的引用。如果您想向CaseRecordItems添加新的cr项,您需要新建一个cr=new TypeOfCR();否则,您只是一次又一次地覆盖同一对象


编辑:请确保在循环内部执行新的操作

因为cr没有得到新的语句(我不知道cr的类型,或者我会告诉您),您只是在反复添加相同的引用。如果您想向CaseRecordItems添加新的cr项,您需要新建一个cr=new TypeOfCR();否则,您只是一次又一次地覆盖同一对象


编辑:确保在循环内部执行新操作

如果在for循环内部没有创建cr(无论是什么),那么每次通过循环都会反复修改相同的对象。您希望在for循环内创建一个新的cr实例。

如果您没有在for循环内创建cr(无论它是什么),那么每次通过循环都会反复修改相同的对象。您希望在for循环内创建一个新的cr实例。

您正在更改循环内的
cr
实例的值。循环中的每个迭代都使用相同的
cr
实例,因此当您更改它时,它们都会更改。要解决此问题,适当的方法是在循环内使用本地实例:

for (int i = 0; i < FirstNames.Count; i++)
{
    CaseRecord cr=new CaseRecord();

    ...

    CaseRecordItems.Add(cr);
}
for(int i=0;i
您正在更改循环中
cr
实例的值。循环中的每个迭代都使用相同的
cr
实例,因此当您更改它时,它们都会更改。要解决此问题,适当的方法是在循环内使用本地实例:

for (int i = 0; i < FirstNames.Count; i++)
{
    CaseRecord cr=new CaseRecord();

    ...

    CaseRecordItems.Add(cr);
}
for(int i=0;i
问题在于变量cr在循环中的两次都是相同的,因此在循环中的两次都修改了相同的对象,并且将相同的对象添加到ArrayList中两次

您没有显示足够的代码来显示cr声明的位置

你需要做像这样的事情吗

for (int i = 0; i < FirstNames.Count; i++)
{
    CRObject cr = new CRObject();

    cr.Firstname = (string)FirstNames[i];
    cr.Lastname = (string)LastNames[i];
    if (FirstNames.Count > 1)
    {
        cr.Tif = baseTif + increment.ToString();
        increment++;
    }
    CaseRecordItems.Add(cr);
}
for(int i=0;i1)
{
cr.Tif=baseTif+increment.ToString();
增量++;
}
案例记录项目。添加(cr);
}

问题在于变量cr在循环中的两次都是相同的,因此在循环中的两次都修改了相同的对象,并且将相同的对象添加到ArrayList中两次

您没有显示足够的代码来显示cr声明的位置

你需要做像这样的事情吗

for (int i = 0; i < FirstNames.Count; i++)
{
    CRObject cr = new CRObject();

    cr.Firstname = (string)FirstNames[i];
    cr.Lastname = (string)LastNames[i];
    if (FirstNames.Count > 1)
    {
        cr.Tif = baseTif + increment.ToString();
        increment++;
    }
    CaseRecordItems.Add(cr);
}
for(int i=0;i1)
{
cr.Tif=baseTif+increment.ToString();
增量++;
}
案例