c# - 使用 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 */ ));
有人可以帮助我或指出正确的方向吗?
解决方案
将源转换为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;
}
}
推荐阅读
- reactjs - 如何在 React Navigation v5 中同时使用堆栈导航、抽屉导航和选项卡导航
- php - 如何同时创建用户和公司模型?拉拉维尔
- python - 如何在一个单词中找到一个字母的多个索引?(Python)
- image - 颤振图像内存没有得到 gc
- swift - SwiftUI 多重绑定
- r - 如何为辅助 y 轴添加图例?
- json - 常规路由不会反序列化 json 正文请求(ASP.NET Core API)
- amazon-web-services - AWS EC2 - 使用 IAM 角色为托管在 S3 上的静态网站提供服务
- c# - C# - 如何在运行时在第二个表单上加载应用程序设置?
- csv - 将 csv 文件传递给 elastic+kibana 时字段混乱