使用AutoMapper时Car [](数组)和IEnumerable <car>之间有区别吗?

时间:2017-10-11 13:44:28

标签: c# .net automapper

在几个项目中,我使用的是AutoMapper的映射函数。我将使用对象 Car 作为完整问题的示例。

首先我的设置

我使用个人资料定义我的地图:

public class CarProfile : Profile
{
    public CarProfile()
    {
        CreateMap<Car, CarResponse>();
    }
}

在ASP.NET Core Web API中初始化 AutoMapper:

services.AddAutoMapper();

使用NuGet包AutoMapperAutoMapper.Extensions.Microsoft.DependencyInjection

映射器在构造函数中自动注入,并设置为私有字段_mapper

最终我使用以下代码映射集合

_mapper.Map<IEnumerable<Car>, IEnumerable<CarResponse>>(_context.Cars);

值得一提的是_context.Cars在这种情况下是DbSet<T>

现在我的实际问题是:如果我使用array代替IEnumerable,会有所不同吗?

示例

_mapper.Map<Car[], CarResponse[]>(_context.Cars);

请考虑性能,清洁代码和行为差异。

1 个答案:

答案 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:21毫秒;
  • 数组:7毫秒;

首先测量阵列:

  • IEnumerable:7毫秒;
  • 数组:21毫秒;

这些结果不具代表性,因为映射器仍然需要预热。

首先映射与此对象相关的集合(以预热映射,初始化缓存等)。

  • IEnumerable:57704 ticks;
  • 数组:122014滴答;

我可以得出结论,映射到IEnumerable(不是数组的东西)比映射到数组要快。事后来看,这听起来很明显。

当输入是数组时:

  • IEnumerable:18642 ticks;
  • 数组:1392个小时;

值得一提的是,如果使用_context.Cars的实际类型DbSet<Car>。它与我使用IEnumerable<Car>时的速度一样快。

建议:我会使用最接近输入的类型,仍然匹配您想要的输出。 就我而言,我将坚持使用IEnumerable。

清洁代码

这部分答案非常具有意义,对评论非常开放。但我认为Car[]的读数优于IEnumerable<Car>

然而,由于存在行为和性能差异,我认为在这里使用数组并不干净。它也改变了意图。因此,使用IEnumerable<T>会更好。