Skip to main content
 首页 » 编程设计

c#之for 循环中的集合值更改

2024年01月16日35lhb25

在过去的几天里,我一直在为 friend 编写一些代码。在较高级别上,它解析文本文件并写入 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); 
} 

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

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

编辑:

根据令人敬畏的反馈(和我的 NumPy ),问题已得到解决。感谢丹的回答,我对使用克隆功能之前尝试过的代码进行了一些更改(是的,海滩我实际上已经尝试过:P)。

新 block 如下所示:
ArrayList CaseRecordItems = new ArrayList();//这是之前创建的
字符串 baseTif = "sometext_";//这是之前创建的
病例记录 cr = 新病例记录();//这将填充“东西”)
字符增量 = '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); 
} 

感谢大家的超快速回复!

请您参考如下方法:

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