You need to enable JavaScript to run this app. C#中foreach每次迭代如何更换对象指针避免列表元素值全部相同
优惠活动
大模型
产品
解决方案
定价
更多

C#中foreach每次迭代如何更换对象指针避免列表元素值全部相同

问题根源

你当前仅在全局初始化了1个XMLTagInfo类实例,整个循环过程中都是修改同一个实例的属性值,添加到editsList里的所有元素都指向同一个内存地址,最终所有值都会被最后一次赋值的内容覆盖。

修复方案

把XMLTagInfo的实例化操作移动到循环内部,每次处理一行Excel数据就创建一个全新的独立实例即可,修改后代码如下:

  1. 全局声明部分调整:
// 仅初始化存储列表,不在全局创建XMLTagInfo实例
List<XMLTagInfo> editsList = new List<XMLTagInfo>();
  1. 循环逻辑调整:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 23:15:04