ReSharper suggested to enumerate an IEnumerable<T> to a list or array since I had "possible multiple enumerations of IEnumerable<T>".
The automatic code re-factoring suggested has some optimization built in to see whether IEnumerable<T> already is an array before calling ToArray().
var list = source as T[] ?? source.ToArray();
- Isn't this optimization already built-in the original LINQ method?
- If not, what would be the motivation not to do so?
Nope, there is no such optimization. If source is ICollection, then it will be copied to new array. Here is code of Buffer<T> struct, which used by Enumerable to create array:
internal Buffer(IEnumerable<TElement> source)
{
TElement[] array = null;
int length = 0;
ICollection<TElement> is2 = source as ICollection<TElement>;
if (is2 != null)
{
length = is2.Count;
if (length > 0)
{
array = new TElement[length]; // create new array
is2.CopyTo(array, 0); // copy items
}
}
else // we don't care, because array is ICollection<TElement>
this.items = array;
}
And here is Enumerable.ToArray() method:
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
Buffer<TSource> buffer = new Buffer<TSource>(source);
return buffer.ToArray(); // returns items
}
来源:https://stackoverflow.com/questions/13790597/is-toarray-optimized-for-arrays