【问题标题】:LINQ to Objects - any performance benefit in using ToArray / ToList over IEnumerable<string>LINQ to Objects - 使用 ToArray / ToList 优于 IEnumerable<string> 的任何性能优势
【发布时间】:2012-12-03 15:15:29
【问题描述】:

这几乎无疑是一个愚蠢的问题。为我辩护,我病了。无论如何。

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

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

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

为了它的价值,myStrings 将在使用时完整地重复使用。

【问题讨论】:

  • 谢谢大家 - 本来会早点接受的,但在我好转之前我就生病了:-(

标签: linq ienumerable linq-to-objects


【解决方案1】:

这是速度与空间的权衡。

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

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

如果你需要随机访问,你一定要调用ToList(),因为ElementAt()是O(n)。

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

【讨论】:

  • 非常有趣的是 ToList 比 ToArray 快;我一直认为它会反过来(没有任何特殊原因)。我现在想知道数组是否比列表处理得更快/更慢。是否有此类信息的良好来源,还是仅基于您自己的实验?
  • @JohnnyReilly:如果您阅读源代码,您会发现ToArray() 有更多步骤。 (由于数组不能有额外的空间,所以没有办法解决)。我怀疑数组比列表快一点点,但可能不足以证明副本的合理性。
【解决方案2】:

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

否则,您每次访问它时都会执行查询(例如通过foreach),因为它是deferred execution。如果查询现在返回不同的结果,这也会导致严重的错误。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这与选角无关。
    • 啊。 Linq 查询返回一个 IQueryable 不是吗。我的错。
    • 否;它返回IEnumerable&lt;T&gt;
    • OP 询问是否返回 List 或数组而不是 IEnumerable 是否有任何好处?
    • 是的,但这仍然与铸造无关。
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多