You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#遍历ArrayList时访问Element对象属性的问题及解决方案

递归遍历混合类型集合拼接字符串解决方案

问题解决说明

感谢@Selvin的帮助,问题已解决,核心问题是类型转换优先级错误,缺少括号导致无法正确访问Element对象的elementComponents属性。另外建议将非泛型的ArrayList替换为泛型List<object>,因为非泛型集合在现代C#中已不再推荐使用。

关键代码修正

原错误代码行:

sb.Append(ListToString((Element)inputList[i].elementComponents));

修正后代码行:

sb.Append(ListToString(((Element)inputList[i]).elementComponents));

完整优化实现

更新Element类(替换ArrayList为List)
public class Element
{
    /// <summary>
    /// Parent-Element that this Element is directly inside of
    /// </summary>
    public Element? parentElement { get; set; }
    /// <summary>
    /// List of Strings AND/OR Elements in this Element
    /// </summary>
    public List<object> elementComponents { get; set; } = new List<object>();
}

修正后的递归拼接方法

private static StringBuilder ListToString(List<object> inputList)
{
    StringBuilder sb = new StringBuilder();
    foreach (var item in inputList)
    {
        if (item is Element element)
        {
            // 递归处理子Element的组件集合
            sb.Append(ListToString(element.elementComponents));
        }
        else
        {
            // 直接拼接字符串类型的元素
            sb.Append(item.ToString());
        }
    }
    return sb;
}

修正点说明

  1. 类型转换优先级:原代码错误地先访问inputList[i]的elementComponents再转Element,修正后先将inputList[i]转为Element对象,再访问其elementComponents属性,逻辑正确。
  2. 泛型集合替换:List<object>比ArrayList类型更安全,减少装箱拆箱开销,符合C#现代开发规范。
  3. 简化类型检查:使用is关键字同时完成类型判断和变量赋值,代码更简洁且支持继承场景。
  4. 遍历方式优化:改用foreach遍历集合,避免手动索引操作的潜在错误,代码更易读。

测试验证

按照给定的Element对象结构调用ListToString(rootObj.elementComponents),会正确返回目标字符串:

OutterTest1 InnerTest1 InnerTest2 OuterTest2 

内容的提问来源于stack exchange,提问作者DTD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:47:47