我正在阅读一个关于在LINQ查询中调用ToList()还是ToArray()更好的问题Is it better to call ToList() or ToArray() in LINQ queries?,并且想知道为什么Enumerable.ToArray()不首先调用Count()方法来查找集合的大小,而是使用内部的Buffer{T}类动态调整大小。类似以下代码:
我知道我们无法理解设计师和实现者的想法,而且我相信他们比我聪明得多。所以问这个问题的最佳方式是:上述方法有什么问题?它似乎分配的内存较少,但仍在O(n)时间内运行。
T[] ToArray<T>(IEnumerable<T> source)
{
var count = source.Count();
var array = new T[count];
int index = 0;
foreach (var item in source) array[index++] = item;
return array;
}
我知道我们无法理解设计师和实现者的想法,而且我相信他们比我聪明得多。所以问这个问题的最佳方式是:上述方法有什么问题?它似乎分配的内存较少,但仍在O(n)时间内运行。
Count()
会导致需要两次枚举该序列。 - Richard DeemingICollection<T>
接口,Buffer<T>
类将使用Count
属性来分配一个正确大小的数组。 - Richard Deeming