我上了这个课:
class ClassFrom
{
public int Id { get; set; }
public string Foo { get; set; }
public string Bar { get; set; }
}
我想将其映射到其中,Id
属性成为字典的键:
class ClassTo
{
public string Foo { get; set; }
public string Bar { get; set; }
}
Dictionary<int, ClassTo> toDict
= mapper.Map<List<ClassFrom>, Dictionary<int, ClassTo>>(fromList);
是否有推荐的方法来实现这一目标?
我发现使用Automapper做到这一点的最好方法对我来说有点代码味道。我实质上是在双重映射对象,首先是通过其构造函数将其映射到ClassTo
,然后是KeyValuePair
:
var cfg = new MapperConfiguration(c =>
{
c.CreateMap<ClassFrom, ClassTo>();
c.CreateMap<ClassFrom, KeyValuePair<int, ClassTo>>()
.ForCtorParam("key", paramOptions => paramOptions.MapFrom(from => from.Id))
.ForCtorParam("value", paramOptions => paramOptions.MapFrom(from => from));
});
IMapper mapper = new AutoMapper.Mapper(cfg);
List<ClassFrom> fromList = new List<ClassFrom>
{
new ClassFrom { Id = 1, Foo = "foo1", Bar = "Bar1" },
new ClassFrom { Id = 2, Foo = "foo2", Bar = "Bar2" }
};
Dictionary<int, ClassTo> toDict
= mapper.Map<List<ClassFrom>, Dictionary<int, ClassTo>>(fromList);
答案 0 :(得分:0)
您可以只在System.Linq命名空间中使用ToDictionary扩展方法。
function extractFaster(arr) {
let res = [0];
function recExtract(arr) {
let hasNonArrayElm = false;
let index = res.length -1;
arr.forEach(curr => {
if (!Array.isArray(curr)) {
hasNonArrayElm ? res[index].push(curr) : res.splice(index, 0, [curr]);
hasNonArrayElm = true;
return;
}
recExtract(curr);
});
}
recExtract(arr);
res.splice(-1, 1)
return res;
}
答案 1 :(得分:0)
您可以使用 ConstructUsing 代替 ForCtorParam 。如果您按如下所示更改映射器配置,则它将正常运行。
var cfg = new MapperConfiguration(c =>
{
c.CreateMap<ClassFrom, ClassTo>();
c.CreateMap<ClassFrom, KeyValuePair<int, ClassTo>>()
.ConstructUsing(x => new KeyValuePair<int, ClassTo>(x.Id, new ClassTo { Bar = x.Bar, Foo = x.Foo }));
});