如何高效将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
相关产品推荐
相关产品推荐

