首页 > 解决方案 > 列表在 foreach 循环中复制列表项中的相同数据

问题描述

我正在循环通过一组 XML 节点,我试图将结果保存到一个列表<>(XML 中有两个项目),但在第二个循环中,两个列表项都是相同的,所以它正在复制最后一个将数据读取到两个列表。

//Test Node Details - If not passed
                if (record.PCBResult != "Passed")
                {
                   
                    TestResultsModel testRecord = new TestResultsModel();
                    record.TestResults = new List<TestResultsModel>();
                    foreach (XElement element in xmlDoc.Descendants("Test"))
                    {
                        testRecord.TestName = element.Attribute("Name").Value;
                        testRecord.TestType = element.Attribute("Type").Value;
                        testRecord.TestItemNumber = element.Attribute("Itemnumber").Value;
                        testRecord.TestSide = element.Attribute("Side").Value;
                        testRecord.TestResult = element.Attribute("Result").Value;
                        testRecord.TestFailure = element.Attribute("Failure").Value;
                        testRecord.TestAoiFailure = element.Attribute("AOIFailure").Value;
                        
                        record.TestResults.Add(testRecord);
                    }
                    
                }

我认为 record.TestResults.Add 会将集合添加到列表中,然后在 foreach 循环的第二次迭代中将新集合添加到第二个列表中。我做错了什么?对不起,我是新手。

标签: c#xmllistforeach

解决方案


我认为您的 testRecord 变量范围不行。“record.TestResults.Add”不是复制你的对象而是一个引用,当你更新你的对象时,它会在列表中更新,你必须将它放在循环中为每次迭代创建一个新对象,尝试这样的事情:

if (record.PCBResult != "Passed")
            {
                record.TestResults = new List<TestResultsModel>();
                foreach (XElement element in xmlDoc.Descendants("Test"))
                {
                    TestResultsModel testRecord = new TestResultsModel();

                    testRecord.TestName = element.Attribute("Name").Value;
                    testRecord.TestType = element.Attribute("Type").Value;
                    testRecord.TestItemNumber = element.Attribute("Itemnumber").Value;
                    testRecord.TestSide = element.Attribute("Side").Value;
                    testRecord.TestResult = element.Attribute("Result").Value;
                    testRecord.TestFailure = element.Attribute("Failure").Value;
                    testRecord.TestAoiFailure = element.Attribute("AOIFailure").Value;
                    
                    record.TestResults.Add(testRecord);
                }
                
            }

有关更多详细信息,请参阅该帖子:list.add 似乎正在添加对原始对象的引用?


推荐阅读