对列表中的每个对象调用方法,或将对象列表传递给方法并返回新列表
本文关键字:列表 方法 对象 返回 新列表 调用 | 更新日期: 2023-09-27 18:33:17
一个太笼统的问题,所以让我补充一些细节:
我有一个实体对象列表,我需要使用自动映射器将其转换为另一个对象。
我已经有一个方法,该方法将实体作为参数,并在调用AutoMapper的.Map()
后返回另一个对象
我的问题是哪个更便宜?
-在列表中的每个实体上调用我预先存在的方法?
使用类似foreach
或.Select(x => transformer.transform(x))
的东西
或
-将实体列表传递给执行foreach然后返回新列表的新方法
这有一般规则吗?
您列出的每种方法的开销都非常低。我会选择最具可读性的,IMO 与 Select
.否则就是过早的优化。
IList<NewT> newList = oldList.Select(transformer.transform).ToList();
(x => transformer.transform(x)
可以简单地写成transformer.transform
这样的上下文,因为该方法与Select
需要的Func<,>
兼容,感谢Jeppe在这里注意到这一点)
但是,如果您已经分析了您的应用程序,并发现您花费了大量时间使用此 LINQ 代码(不仅仅是在transform
部分),最快的方法可能是自己编写一个for
循环(无论是内联还是在其他方法中都无关紧要,我希望 JITter 在运行时内联它, 或者开销这么小,没关系)。
IList<NewT> newList = new List<NewT>(oldList.Count);
for (int i = 0; i < oldList.Count; i++)
newList[i] = transformer.transform(oldList[i]);
但是,我发现这不太可能,因为与 LINQ 相比,从数据库中提取实体和自动映射的速度要慢得多。
无需遍历要映射的列表。自动映射器能够将列表转换为其他列表。例如;如果将 IEnumerable
在这里查看: http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays
似乎您的答案将取决于列表的使用 - 您是否将其视为IQueryable<T>
或IEnumerable<T>
或List<T>
- 越接近您需要列表的具体阵列状结构,它就越昂贵。如果您可能使用 LINQ 来减少通过自动映射器转换的调用次数...
所以,你真的想从List<T>
转变为List<T>
是应该在这里指导你的问题。