C# Linq ToList/ToArray/ToDictionary性能

C# Linq ToList/ToArray/ToDictionary性能,c#,.net,performance,linq,C#,.net,Performance,Linq,我遇到很多情况,仅仅有一个IEnumerable是不够的。但是,我不确定上述方法调用的性能 我真正想问的是: 是ToList/ToArray的性能: 将IEnumerable复制到新数组/列表的O(n)操作 如果我在一个列表上调用一个linq扩展方法,那么如果我调用ToList,它的性能为O(1),如果调用ToArray,它的性能为O(n)(如果我的原始列表是数组,则性能相反) 一些魔术发生了,表演是O(1) 可能到字典是O(n),对吗 ToList/ToArray的性能是否是将IEnumera

我遇到很多情况,仅仅有一个IEnumerable是不够的。但是,我不确定上述方法调用的性能

我真正想问的是:

是ToList/ToArray的性能:

  • 将IEnumerable复制到新数组/列表的O(n)操作
  • 如果我在一个列表上调用一个linq扩展方法,那么如果我调用ToList,它的性能为O(1),如果调用ToArray,它的性能为O(n)(如果我的原始列表是数组,则性能相反)

  • 一些魔术发生了,表演是O(1)

  • 可能到字典是O(n),对吗

    ToList
    /
    ToArray
    的性能是否是将
    IEnumerable
    复制到新数组/列表的O(n)操作

    ToList
    的效率稍高一些,因为它不需要先将内部缓冲区修剪到合适的长度

    如果我在一个列表上调用一个linq扩展方法,那么如果我调用ToList,它的性能为O(1),如果调用ToArray,它的性能为O(n)(如果我的原始列表是数组,则性能相反)

    否。对于两个调用,始终会创建一个新集合;那是原始收藏的肤浅复制品。在任何
    ICollection
    上调用
    ToList
    ToArray
    要比在一个简单的
    IEnumerable
    上调用
    ToList
    更有效,因为它没有实现
    ICollection
    ,但是对于一个已知长度的集合来说,它的开头就是。(不过,这是在执行时检测到的;您不需要担心编译时类型。)

    可能到字典是O(n),对吗

    假设散列是合理的,它是O(N),是的。基本上,它创建了一个新的字典,就像你可能期望的那样

    您可能想阅读my Edulink博客系列中的相应文章:


    我还想在你的答案中添加这个链接:@JonSkeet:wow,我没有注意到这是你的博客帖子:)不得不说,真不错@MarcinJuraszek是的,看看完整的和电子书。难以置信的东西,真的有助于理解Linq、集合迭代,以及它的一些优雅;真的拓展了我的思路。说到电子书,Jon有没有计划再次更新/编辑已发布的PDF版本?我完全会买一个经过充分打磨和印刷的版本@克瑞辛克莱尔:有一家出版商实际上拥有这本书的版权,但我仍然不知道他们是否打算使用它…@JonSkeet,博客链接现在断了。看起来路径的第一段从
    jon_skeet
    更改为
    jonskeet
    。以下是新链接,以防有人需要它们:,