首页 > 解决方案 > 使用 Automapper 从对象列表转换为二维数组属性

问题描述

我正在尝试使用 AutoMapper 将对象列表转换为另一个对象的 2D 数组属性。这是尝试创建 GeoJson 格式的响应。

来源类型

public class GeoCoordinateEntity
{
   public double Latitude { get; set; }
   public double Longitude  { get; set; }
}

目标类型

public class GeoEvent
{
   // Enum which in this case will be always Maps to LineString.
   public GeometryType GeometryType { get; set; }
   // Trying to Map this format??....
   public double[,] Coordinates { get; set; }
}

我得到 IEnumerable 并试图将其映射到 GeoEvent 的 Coordinates 属性。这是我挣扎的地方。

 CreateMap<IEnumerable<GeoCoordinateEntity>, GeoEvent>()
    .ForMember(
        dest => dest.GeometryType,
        opt => opt.MapFrom(src => GeometryType.LineString))
    .ForMember(
        dest => dest.Coordinates,
        opt => opt.MapFrom(src => /* Need Help */ ));

有人可以帮助我或指出正确的方向吗?

标签: c#automappergeojson

解决方案


将源转换为IEnumerable<IEnumerable<double>>,然后编写扩展方法将其转换为 2D Array。

 CreateMap<IEnumerable<GeoCoordinateEntity>, GeoEvent>()
        .ForMember(dest => dest.Coordinates, opt => opt.MapFrom(source => 
        source.Select(prop => new List<double>
        {
            prop.Latitude,
            prop.Longitude
        })
        .To2DArray()));

创建二维数组的扩展方法

static class EnumerableExtensions
{
    public static T[,] To2DArray<T>(this IEnumerable<IEnumerable<T>> source)
    {
        var data = source
            .Select(x => x.ToArray())
            .ToArray();

        var res = new T[data.Length, data.Max(x => x.Length)];
        for (var i = 0; i < data.Length; ++i)
        {
            for (var j = 0; j < data[i].Length; ++j)
            {
                res[i, j] = data[i][j];
            }
        }

        return res;
    }
}

推荐阅读