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的说法,这是有效的。我可以很容易地想象,这是一个更大系统的一小部分,还有许多其他类型,其中在一个域中,typea
具有List
属性,而在另一个域中,typeB
具有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的说法,这是有效的。我可以很容易地想象,这是一个更大系统的一小部分,还有许多其他类型,其中在一个域中,typea
具有List
属性,而在另一个域中,typeB
具有Dictionary
属性。尝试.Map(source)
时,此MapperConfiguration
完全相关。是的,但您不再需要第一个映射。ConvertUsing更适合,因为在ConstructUsing之后不会映射任何其他内容。确实不在ConstructUsing之后映射吗?我尝试在使用后映射,然后我没有得到任何异常。您能提供更多详细信息吗?只有在手动将ClassFrom
转换为ClassTo
非常简单的情况下,这才是可行的。考虑更精细的对象,这些属性也需要转换。是的,但是你不再需要第一张地图了。ConvertUsing更适合,因为在ConstructUsing之后不会映射任何其他内容。确实不在ConstructUsing之后映射吗?我尝试在使用后映射,然后我没有得到任何异常。您能提供更多详细信息吗?只有在手动将ClassFrom
转换为ClassTo
非常简单的情况下,这才是可行的。考虑更精细的对象,这些对象也有需要转换的属性。