1

这可能是一个太笼统的问题,所以让我添加一些细节:

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

我已经有一个将实体作为参数并在调用 AutoMapper 后返回另一个对象的方法.Map()

我的问题是哪个更便宜?

- 在列表中的每个实体上调用我预先存在的方法?

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

或者

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

对此有一般规则吗?

4

3 回答 3

3

您列出的每种方法的开销都非常低。我会选择最易读的,IMO 与Select. 否则就是过早的优化

IList<NewT> newList = oldList.Select(transformer.transform).ToList();

x => transformer.transform(x)可以在这样的上下文中简单地写,因为该方法与需要transformer.transform兼容,Func<,>感谢Jeppe注意到这里)Select

但是,如果您分析了您的应用程序并发现您在此 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 相比,从数据库中提取实体和自动映射非常缓慢。

于 2013-09-30T14:30:25.520 回答
1

您无需遍历要映射的列表。AutoMapper 能够将一个列表转换为另一个列表。例如; 如果将 TSource 映射到 Tdestination,则可以将 IEnumerable<TSource> 转换为 IEnumerable<Tdestination>。

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

于 2013-09-30T15:04:44.100 回答
0

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

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

于 2013-09-30T14:27:45.307 回答