C# 将列表映射到字典

C# 将列表映射到字典,c#,.net,automapper,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; } } Dic

我有这门课:

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);
您只需在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 } 
);
您只需在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 } 
);
您可以使用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 }));
        });
var cfg=新的MapperConfiguration(c=>
{
c、 CreateMap();
c、 CreateMap()
.ConstructUsing(x=>newkeyvaluepair(x.Id,newclassto{Bar=x.Bar,Foo=x.Foo}));
});
您可以使用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 }));
        });
var cfg=新的MapperConfiguration(c=>
{
c、 CreateMap();
c、 CreateMap()
.ConstructUsing(x=>newkeyvaluepair(x.Id,newclassto{Bar=x.Bar,Foo=x.Foo}));
});

为什么要使用automapper进行此操作?为什么不仅仅是:
var-toDict=fromList.ToDictionary(x=>x.Id,x=>newclassto{Foo=x.Foo,Bar=x.Bar})这不是“映射”,而是一种转换。“AM不是正确的工具。”MarcGravell对于这个微不足道的示例,我同意你的看法,但我希望这显然只是一个示例。让我们假设Automapper在这里是合适的。@CoryNelson当你问这个问题时,我们不能安全地假设它是合适的。你有没有收到任何错误,或者只是对你不起作用?我同意@CoryNelson的说法,这是有效的。我可以很容易地想象,这是一个更大系统的一小部分,还有许多其他类型,其中在一个域中,type
a
具有
List
属性,而在另一个域中,type
B
具有
Dictionary
属性。尝试
.Map(source)
时,此
MapperConfiguration
是完全相关的。为什么要使用automapper进行此操作?为什么不仅仅是:
var-toDict=fromList.ToDictionary(x=>x.Id,x=>newclassto{Foo=x.Foo,Bar=x.Bar})这不是“映射”,而是一种转换。“AM不是正确的工具。”MarcGravell对于这个微不足道的示例,我同意你的看法,但我希望这显然只是一个示例。让我们假设Automapper在这里是合适的。@CoryNelson当你问这个问题时,我们不能安全地假设它是合适的。你有没有收到任何错误,或者只是对你不起作用?我同意@CoryNelson的说法,这是有效的。我可以很容易地想象,这是一个更大系统的一小部分,还有许多其他类型,其中在一个域中,type
a
具有
List
属性,而在另一个域中,type
B
具有
Dictionary
属性。尝试
.Map(source)
时,此
MapperConfiguration
完全相关。是的,但您不再需要第一个映射。ConvertUsing更适合,因为在ConstructUsing之后不会映射任何其他内容。确实不在ConstructUsing之后映射吗?我尝试在使用后映射,然后我没有得到任何异常。您能提供更多详细信息吗?只有在手动将
ClassFrom
转换为
ClassTo
非常简单的情况下,这才是可行的。考虑更精细的对象,这些属性也需要转换。是的,但是你不再需要第一张地图了。ConvertUsing更适合,因为在ConstructUsing之后不会映射任何其他内容。确实不在ConstructUsing之后映射吗?我尝试在使用后映射,然后我没有得到任何异常。您能提供更多详细信息吗?只有在手动将
ClassFrom
转换为
ClassTo
非常简单的情况下,这才是可行的。考虑更精细的对象,这些对象也有需要转换的属性。