Отображение списка в словарь - PullRequest
0 голосов
/ 30 июня 2018

У меня есть этот класс:

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 голосов
/ 30 июня 2018

Вы можете использовать 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 }));
        });
0 голосов
/ 30 июня 2018

Вы можете просто использовать метод расширения ToDictionary в пространстве имен System.Linq.

//using System.Linq;
var toDict = fromList.ToDictionary
(
    //Define key
    element => element.Id,   

    //Define value
    element => new ClassTo { Foo = element.Foo, Bar = element.Bar } 
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...