将列表映射到字典

时间:2018-06-29 21:42:38

标签: c# .net automapper

我上了这个课:

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);

2 个答案:

答案 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 }));
        });