【问题标题】:Convert an array of one datatype to array of another in NET core in an efficient way?以有效的方式将一种数据类型的数组转换为 NET 核心中的另一种数据类型的数组?
【发布时间】:2020-02-26 11:21:40
【问题描述】:

我有一个数据库实体数组,我需要将其转换为不同的类以用作 REST 请求结果:

DatabaseDTO[] arrayFromDb = _repo.GetAllData();
OutgoinDTO[] = convertFromDatabaseDTO (arrayFromDb);

最有效的方法是什么(我假设OutgoingDTO 有一个采用DatabaseDTO 的构造函数)

【问题讨论】:

  • 鉴于您在数组之间进行转换,也许Array.ConvertAll() 可以解决问题?这可能是最有效的。
  • 定义“高效”;编码努力?内存使用情况?运行?依赖树?代码行?分配?这些都是相互竞争的因素:你不能说“全部”
  • 为什么不创建一个具有所需大小的新数组并循环?这就是Array.ConvertAll 所做的。您有特定的性能问题吗?例如,转换构造函数本身就是将这两种类型绑定在一起的额外复杂性。为什么不使用单独的转换方法?还是自动映射器?你在找什么?
  • 一种方法是不要一开始就构建“错误”类型的数组。如果您可以即时转换它们,您将节省大量内存。查看您的存储库是否可能无法进行重写,它返回 IEnumerable 而不是数组。
  • 明确地说,DatabaseDTO[] arrayFromDb = _repo.GetAllData(); OutgoinDTO[] = Array.ConvertAll(arrayFromDb, x => new OutgoinDTO(x));

标签: c# arrays list .net-core


【解决方案1】:

您可以使用 LINQ 来映射另一个对象,如下所示:

var outgoinDTO = arrayFromDb.Select(x => new OutgoinDTO() {
  outgoing_param1 = arrayFromDb.param1,
  outgoing_param2 = arrayFromDb.param2,
  outgoing_param3 = calcSum(arrayFromDb.param2, arrayFromDb.param3),
  ..
  outgoing_paramn = arrayFromDb.paramn
});

calcSum(int a, int b) {
  return a + b;
}

因此,您可以从 DbClass 计算 Dto 参数的一些结果。 如果两个类具有相同的参数(DbClass 和 DtoClass),则可以使用 AutoMapper,@Adem Aygun 如下所述

【讨论】:

    【解决方案2】:

    你可以使用AutoMapper.Collection

    Mapper.Map<List<OrderDTO>,List<Order>>(orderDtos, orders);
    

    这里是this

    对于不同的members

        Mapper.CreateMap<Employee, EmployeeDto>()
       .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
    

    【讨论】:

    • 仅当两个类中几乎都存在参数时才使用自动映射器。如果需要执行一些函数来计算参数结果,最好使用linq
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2020-05-27
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多