对列表中的每个对象调用方法,或将对象列表传递给方法并返回新列表?

时间:2013-09-30 14:24:08

标签: c# list

这可能过于笼统,所以让我补充一些细节:

我有一个实体对象列表,我需要使用AutoMapper将其转换为另一个对象。

我已经有一个方法,它将一个实体作为参数,并在调用AutoMapper的.Map()

后返回另一个对象

我的问题哪个更便宜?

从列表中的每个实体上预先存在我的方法吗?

使用foreach.Select(x => transformer.transform(x))

等内容

- 将实体列表传递给执行foreach的新方法,然后返回新列表

这是否有一般规则?

3 个答案:

答案 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>这个问题应该引导你。