Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ToList()的效率_C#_.net - Fatal编程技术网

C# ToList()的效率

C# ToList()的效率,c#,.net,C#,.net,与我一起工作的许多开发人员都觉得使用列表比使用IEnumerable更舒服(例如)。我想知道ToList()过度使用是否会影响性能。例如,或将在订购后使用ToList()再次获取列表,即 private void ListThinger(List<T> input) { input = input.OrderBy(s => s.Thing).ToList(); foreach(var thing in input) { // do things }

与我一起工作的许多开发人员都觉得使用
列表
比使用
IEnumerable
更舒服(例如)。我想知道
ToList()
过度使用是否会影响性能。例如,或将在订购后使用
ToList()
再次获取列表,即

private void ListThinger(List<T> input)
{
  input = input.OrderBy(s => s.Thing).ToList();
  foreach(var thing in input)
  {
      // do things
  }
}
private void ListThinger(列表输入)
{
input=input.OrderBy(s=>s.Thing.ToList();
foreach(输入中的变量)
{
//做事
}
}
我的问题是:

  • ToList()
    方法的效率如何?它会创建一个新的列表吗?假设内容是POCO,那么需要多少内存?如果是值类型而不是POCO,是否会发生变化
  • 列表的大小决定效率还是不决定成本
  • 如果将列表强制转换为
    IEnumerable
    ,然后对其调用
    ToList()
    ,它会返回原始对象吗
顺便说一句,我知道一次使用ToList不会造成任何损失,但我们正在构建一个高度并发的系统,目前CPU有限,因此我希望能获得一些小的胜利,当规模扩大时,这些胜利将带来巨大的改进

ToList()方法的效率如何?它会创建一个新的列表吗?假设内容是POCO,那么需要多少内存?如果是值类型而不是POCO,是否会发生变化

ToList()
方法通过创建一个新列表并用给定集合的项填充它来具体化给定集合:

当您得到一个具体化的列表(而不是可能在不同的执行中执行的
iQuery
/
IEnumerable
)时,在添加后添加
ToList
不会给您带来任何好处

您可以查看此处,也可能会有所帮助:

  • 是,创建一个新列表。很难准确测量内存使用情况,但可能是类大小+(系统字大小*元素计数)。我建议使用内存分析器
  • 运算的算法效率当然会受到元素计数的影响
  • 是的,你每次都会得到一份全新的名单。内部的引用不会重复,但基本体会重复 你自己试试吧:

    var list = new List<int>();
    bool areListsTheSame = list == ((IEnumerable<int>)list).ToList();
    
    var list=newlist();
    bool arelisthesame=list==((IEnumerable)list.ToList();
    
    如文档所述,它从
    IEnumerable
    创建一个
    列表。因此,问题1p2和3已经得到了回答(您的第一个问题实际上是4个问题,应该分开)。在您的特定示例中,
    ToList
    应该被删除,因为它不增加任何值(因为您所做的只是对它进行一次迭代)。可能重复。有任何原因您不能自己测试这些内容吗?
    ToList()
    非常高效。在您不需要的时候调用它是低效的。至少值得注意的是,在构造函数中,如果它可以强制转换为
    ICollection
    ,那么它会尝试使用
    Array.CopyTo
    ,从而在某种程度上提高效率,尽管它仍然是O(n),由于它使用非托管内部
    Copy
    方法,因此比您自己能做的效率更高。效率不如.NET core中创建缓冲区链接列表的新
    ToArray
    方法,而不是在内部数组用完时进行复制调整大小。它进行一次完整的迭代,捕获缓冲区集群中的所有元素,然后将它们全部复制到最后的数组中。@AdamHouldsworth和
    OrderBy
    如果源是固定长度的,那么它甚至不需要链表,因为它知道开始时的大小(在这种情况下,
    ToList()
    也使用这种效率)但是即使是最有效的
    ToList()
    也会比不做一件事效率更低,因为它什么也得不到。@Chris-这有助于你找到答案吗?
    input = input.OrderBy(s => s.Thing).ToList();
    foreach(var thing in input)
    {
       // do things
    }
    
    var list = new List<int>();
    bool areListsTheSame = list == ((IEnumerable<int>)list).ToList();