在几个项目中,我使用的是AutoMapper的映射函数。我将使用对象 Car 作为完整问题的示例。
首先我的设置:
我使用个人资料定义我的地图:
public class CarProfile : Profile
{
public CarProfile()
{
CreateMap<Car, CarResponse>();
}
}
我在ASP.NET Core Web API中初始化 AutoMapper:
services.AddAutoMapper();
使用NuGet包AutoMapper
和AutoMapper.Extensions.Microsoft.DependencyInjection
映射器在构造函数中自动注入,并设置为私有字段_mapper
。
最终我使用以下代码映射集合:
_mapper.Map<IEnumerable<Car>, IEnumerable<CarResponse>>(_context.Cars);
值得一提的是_context.Cars
在这种情况下是DbSet<T>
。
现在我的实际问题是:如果我使用array
代替IEnumerable
,会有所不同吗?
示例:
_mapper.Map<Car[], CarResponse[]>(_context.Cars);
请考虑性能,清洁代码和行为差异。
答案 0 :(得分:1)
行为差异
我生成了执行计划,我可以得出结论,至少 是一个区别。请参阅此链接以进行比较:https://www.diffnow.com/?report=elujt。分析C#代码清楚地表明,使用数组时会发生更多。
<强>性能强>
由于这仍未提供任何性能见解,因此我使用Stopwatch进行了测量。
var watchienumerable = Stopwatch.StartNew();
var ienumerable = _mapper.Map<IEnumerable<Car>, IEnumerable<CarResponse>>(contextDevices);
watchienumerable.Stop();
首先测量IEnumerable:
首先测量阵列:
这些结果不具代表性,因为映射器仍然需要预热。
首先映射与此对象相关的集合(以预热映射,初始化缓存等)。
我可以得出结论,映射到IEnumerable(不是数组的东西)比映射到数组要快。事后来看,这听起来很明显。
当输入是数组时:
值得一提的是,如果使用_context.Cars
的实际类型DbSet<Car>
。它与我使用IEnumerable<Car>
时的速度一样快。
建议:我会使用最接近输入的类型,仍然匹配您想要的输出。 就我而言,我将坚持使用IEnumerable。
清洁代码
这部分答案非常具有意义,对评论非常开放。但我认为Car[]
的读数优于IEnumerable<Car>
。
然而,由于存在行为和性能差异,我认为在这里使用数组并不干净。它也改变了意图。因此,使用IEnumerable<T>
会更好。