【发布时间】:2015-04-14 16:25:10
【问题描述】:
最近我参与了一些涉及跨不同数据域转换对象的程序。所以我有很多映射方法(有时作为扩展方法)用于将一种类型的对象转换为不同域中的另一种类似类型。通常,我还需要一种将 List 转换为上述类型的 List 的方法。这总是涉及到一个方法,它简单地创建一个目标类型的 List,运行一个 foreach 循环来添加源 List 的每个元素(但在每个元素上使用映射方法)并返回新列表。感觉很重复,就像语言中可能内置了一些东西来做到这一点(也许在 LINQ 中?)。我已经研究了几个涉及 List.ForEach() 的类似问题以及它的优缺点(反正不是我想要的)。我将在下面用一些示例代码进行说明。也许没有办法做我想做的事,如果这是答案,那就是答案,但我希望也许有。请注意,这显然只是示例代码,关于我的整体程序设计的 cmets 不会真正添加任何内容,因为这是手头问题的一个非常小的虚拟版本。
class A
{
public Guid Id { get; set; }
public string Email { get; set; }
public string MemberCode { get; set; }
}
class B
{
public string Email { get; set; }
public string MemberCode { get; set; }
// My custom mapping method
public A MapToA()
{
return new A()
{
Id = Guid.NewGuid(),
Email = this.Email,
MemberCode = this.MemberCode
};
}
// For list mapping, I have this, but I'd prefer
// to do something else that could utilize my custom mapper.
// Perhaps a built in LINQ method?
public static List<A> MapToListOfA(List<B> listOfB)
{
List<A> listOfA = new List<A>();
foreach (var b in listOfB)
{
listOfA.Add(b.MapToA());
}
return listOfA;
}
}
// Class C shows what I currently do that I'd like to get
// away from:
class C
{
public List<A> ListOfA { get; set; }
// other properties unrelated to the problem
// This is how I might use the MapToListOfA method,
// but I'd rather have something better.
public C(List<B> listOfB)
{
this.ListOfA = B.MapToListOfA(listOfB);
}
}
// I'd like something more like this:
class D
{
public List<A> ListOfA { get; set; }
// other properties unrelated to the problem
public D(List<B> listOfB)
{
// This doesn't compile, of course, but I hope
// it illustrates what I'm intending to do:
this.ListOfA = listOfB.Select(b => b.MapToA());
}
}
【问题讨论】:
-
你看过 AutoMapper 吗??
-
你的方法不错。只需添加对 .ToList() 的调用即可。
-
我当然很喜欢这个网站上那些不加解释地投反对票的巨魔。请巨魔,看看stackoverflow.com/help/how-to-ask,告诉我我违反了哪一部分。我怀疑您对这个问题的问题是“您应该已经知道答案”。这是在提问网站上的一种很好的态度。尽管我非常喜欢这个社区,因为这些积极的人,这些点击快乐的反对者是一个巨大的关闭。
-
@EhsanSajjad - 不,我没有。我会检查一下。不过,我确实喜欢简单地做简单的事情,并且尽可能不使用库。
标签: c# linq list extension-methods