这可能过于笼统,所以让我补充一些细节:
我有一个实体对象列表,我需要使用AutoMapper将其转换为另一个对象。
我已经有一个方法,它将一个实体作为参数,并在调用AutoMapper的.Map()
我的问题哪个更便宜?
从列表中的每个实体上预先存在我的方法吗?
使用foreach
或.Select(x => transformer.transform(x))
或
- 将实体列表传递给执行foreach的新方法,然后返回新列表
这是否有一般规则?
答案 0 :(得分:3)
您列出的每种方法都会产生非常低的开销。我会选择最具可读性的IMO Select
。否则是premature optimization。
IList<NewT> newList = oldList.Select(transformer.transform).ToList();
(x => transformer.transform(x)
可以在这样的上下文中简单地写为transformer.transform
,因为该方法与Func<,>
所需的Select
兼容,归功于{{3}注意到这里)
但是,如果你已经分析了你的应用程序并发现你花了很多时间使用这个LINQ代码(不仅仅是transform
部分),那么最快的方法可能是写出{ {1}}循环自己(无论是内联还是其他方法都不重要,我希望JITter在运行时内联它,或者有一个小的开销,无关紧要。)
for
然而,我发现这种情况极不可能,因为与LINQ相比,从数据库和自动化中提取实体的速度要慢得多。
答案 1 :(得分:1)
您无需遍历要映射的列表。 AutoMapper能够将列表转换为其他列表。 例如;如果你将TSource映射到TDestination,那么你可以转换IEnumerable&lt; TSource&GT;到IEnumerable&lt; TDestination&GT;
点击此处:http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays
答案 2 :(得分:0)
您的回答似乎取决于列表的使用情况 - 您是将其视为IQueryable<T>
还是IEnumerable<T>
还是List<T>
- 更接近于具体的arraylike结构你需要的列表,它是更昂贵的。如果您可能使用LINQ来减少通过AutoMapper转换的调用次数......
那么,你真的想从List<T>
转变为List<T>
这个问题应该引导你。