0

这几乎毫无疑问是一个愚蠢的问题。为我辩护,我病了。反正。

我有一个内存对象列表。我使用以下表达式从对象列表中提取出我感兴趣的字符串:

var myStrings = myListOfObjects.Select(r => r.MyString);

这为我提供了一个 IEnumerable 字符串。myStrings 稍后将在我的代码中多次重复使用。我想知道的是,在使用之前对其执行 ToArray 或 ToList (即“贪婪”运算符)是否有任何性能优势?(所以我的操作将直接针对数组/列表。)

对于它的价值, myStrings 将在使用时全部重新使用。

4

3 回答 3

5

这是速度与空间的权衡。

如果您的Select()回调计算量很大,您可能希望计算一次并将其存储以备后用。

如果没有,您可能希望节省存储空间并每次都计算它。

如果你需要随机访问,你绝对应该调用ToList(),因为ElementAt()是 O(n)。

请注意,这ToList()比 快ToArray(),因为ToArray()需要在完成后修剪数组。

于 2012-12-03T15:16:55.477 回答
1

myStrings只是一个查询而不是一个集合。如果您多次需要它并且它不是太大(对于内存),您最好通过ToArrayor创建一个集合ToList

否则,您每次访问它时都会执行查询(fe via foreach),因为它是deferred execution。如果查询现在返回不同的结果,这也可能导致令人讨厌的错误。

于 2012-12-03T15:17:18.293 回答
0

除非您特别需要List 或 Array 功能,否则将其保留为 IEnumerable 是最好的。没有强制转换 == 更少的计算周期。

于 2012-12-03T15:17:28.130 回答