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

本文关键字:列表 方法 对象 返回 新列表 调用 | 更新日期: 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 转换为 IEnumerable

在这里查看: http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays

似乎您的答案将取决于列表的使用 - 您是否将其视为IQueryable<T>IEnumerable<T>List<T> - 越接近您需要列表的具体阵列状结构,它就越昂贵。如果您可能使用 LINQ 来减少通过自动映射器转换的调用次数...

所以,你真的想从List<T>转变为List<T>是应该在这里指导你的问题。