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

如何高效将IEnumerator转为ArrayList?无需遍历及Tekla场景适配

问题解答

1. 能否直接将IEnumerator强制转换为ArrayList?

不行。IEnumerator只是迭代器接口,仅负责逐个遍历集合元素,本身并不存储完整数据集。强制转换会直接抛出InvalidCastException——ArrayList是具体的集合存储类,和IEnumerator没有继承或实现关系,无法直接转换。

2. 能否使用System.Linq.Enumerable.ToArray()实现需求?

可以,但需要先把IEnumerator转换为IEnumerable<T>(或非泛型IEnumerable),因为Enumerable.ToArray()的扩展方法仅对IEnumerable<T>生效。

实现方案:

根据Tekla返回的枚举器类型,选择对应的包装方式:

泛型IEnumerator场景:

先写一个扩展方法将枚举器包装为可枚举集合:

public static IEnumerable<T> ToEnumerable<T>(this IEnumerator<T> enumerator)
{
    if (enumerator == null)
        throw new ArgumentNullException(nameof(enumerator));
        
    try
    {
        while (enumerator.MoveNext())
        {
            yield return enumerator.Current;
        }
    }
    finally
    {
        // 释放枚举器持有的资源(若实现了IDisposable)
        enumerator.Dispose();
    }
}

随后即可调用ToArray():

// 假设yourEnumerator是Tekla返回的IEnumerator<YourTeklaObject>
var resultArray = yourEnumerator.ToEnumerable().ToArray();
非泛型IEnumerator场景:

若Tekla返回的是非泛型枚举器,使用以下扩展方法:

public static IEnumerable ToEnumerable(this IEnumerator enumerator)
{
    if (enumerator == null)
        throw new ArgumentNullException(nameof(enumerator));
        
    try
    {
        while (enumerator.MoveNext())
        {
            yield return enumerator.Current;
        }
    }
    finally
    {
        // 尝试释放资源
        (enumerator as IDisposable)?.Dispose();
    }
}

配合类型转换后调用ToArray():

var resultArray = yourEnumerator.ToEnumerable().Cast<YourTeklaObject>().ToArray();

为什么这种方式比手动遍历ArrayList快?

Enumerable.ToArray()(或ToList())内部做了容量预分配优化:它会先估算元素总量,一次性分配足够的数组空间,避免了ArrayList添加大量元素时的频繁扩容操作——每次扩容都需要复制整个数组,几十万条数据下会产生大量额外性能开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:15:47