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(输入中的变量)
{
//做事
}
}
我的问题是:
方法的效率如何?它会创建一个新的列表吗?假设内容是POCO,那么需要多少内存?如果是值类型而不是POCO,是否会发生变化ToList()
- 列表的大小决定效率还是不决定成本
- 如果将列表强制转换为
,然后对其调用IEnumerable
,它会返回原始对象吗ToList()
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();