C#中foreach每次迭代如何更换对象指针避免列表元素值全部相同
问题根源
你当前仅在全局初始化了1个XMLTagInfo类实例,整个循环过程中都是修改同一个实例的属性值,添加到editsList里的所有元素都指向同一个内存地址,最终所有值都会被最后一次赋值的内容覆盖。
修复方案
把XMLTagInfo的实例化操作移动到循环内部,每次处理一行Excel数据就创建一个全新的独立实例即可,修改后代码如下:
- 全局声明部分调整:
// 仅初始化存储列表,不在全局创建XMLTagInfo实例 List<XMLTagInfo> editsList = new List<XMLTagInfo>();
- 循环逻辑调整:
foreach (Row r in sheetData.Elements<Row>().Skip(1)) { List<string> data = new List<string>(); foreach (Cell c in r.Elements<Cell>()) { if (c.DataType != null && c.DataType == CellValues.SharedString) { int id = -1; // 建议将cellValue声明在内层循环内,避免全局变量复用异常 string cellValue = string.Empty; if (Int32.TryParse(c.InnerText, out id)) { SharedStringItem item = GetSharedStringItemById(workbookPart, id); if (item.Text != null) { cellValue = item.Text.Text; } else if (item.InnerText != null) { cellValue = item.InnerText; } else if (item.InnerXml != null) { cellValue = item.InnerXml; } } data.Add(cellValue); } } // 每次循环创建全新的XMLTagInfo实例 XMLTagInfo xMLTagInfo = new XMLTagInfo(); xMLTagInfo.FileName = data[0]; xMLTagInfo.Type = data[1]; xMLTagInfo.ParentTag = data[2]; xMLTagInfo.TagName = data[3]; xMLTagInfo.AttrName = data[4]; editsList.Add(xMLTagInfo); }
额外注意点
读取data数组下标前可以先判断data.Count >=5,避免Excel行单元格缺失导致的索引越界异常。
内容的提问来源于stack exchange,提问作者Yashoda Chandrasekara
相关产品推荐
相关产品推荐

