一、ToArray() 基础核心特性
方法定位:它是LINQ提供的扩展方法,定义在System.Linq命名空间下,可将所有实现IEnumerable<T>接口的集合(如List<T>、LINQ查询结果)转换为同类型的数组T[]。
执行机制:该方法会立即执行源序列的遍历,创建全新数组并复制所有元素,属于立即物化操作,会终止LINQ的延迟执行特性,直接缓存结果。
数据隔离性:转换后的数组是完全独立的副本,对原集合的增删改操作不会影响数组内容,反之修改数组也不会同步到原集合。
二、基础常规用法
List<T> 转数组
List<int> numList = new List<int> {1,2,3,4,5};
int[] numArray = numList.ToArray();
这是最常用的场景,可将泛型列表快速转换为数组,适配仅支持数组作为入参的老版本API。
LINQ查询结果物化
// 筛选未处理的订单,直接将查询结果转为数组
Order[] pendingOrders = orders
.Where(o => !o.IsProcessed)
.OrderBy(o => o.Amount)
.ToArray();
该用法可避免多次遍历LINQ延迟序列导致的重复执行查询逻辑问题,提升性能。
三、与IEqualityComparer 结合的实战场景
在LINQ集合操作中传入自定义比较器后,可直接链式调用.ToArray()将处理后的结果转为数组,实现复杂业务逻辑:
自定义去重后转数组
// 传入自定义IEqualityComparer实现按Id去重,结果转为数组
Product[] distinctProducts = productList
.Distinct(new ProductByIdComparer())
.ToArray();
集合求差集后转数组
// 求两个集合的差值,传入自定义比较器后转为数组
IEnumerable<DataInput_PopulationInfo> exceptResult = drArray
.Except(hjArray, new DataInput_PopulationInfoComparer());
DataInput_PopulationInfo[] finalResult = exceptResult.ToArray();
该场景常被用于数据同步时的增量数据筛选,是实际项目中非常高频的用法。
3. 合并去重后转数组
// 两个数组合并并自动去重,传入自定义比较器控制去重规则
string[] mergedArr = arr1
.Union(arr2, new CustomStringComparer())
.ToArray();
默认的Union方法使用内置相等比较逻辑,传入自定义IEqualityComparer后可实现忽略大小写、按指定属性去重等自定义规则。
四、性能与使用注意事项
性能开销:每次调用都会触发一次完整的O(n)遍历和内存分配,处理百万级以上的大型集合时,频繁调用会产生额外内存开销,需谨慎使用。
命名空间依赖:使用前必须在文件头部引入using System.Linq;,否则编译器无法识别该扩展方法。
空值安全:源序列为null时调用该方法会抛出空引用异常,建议调用前先做非空校验。