ToArray()从数组返回吗?

时间:2015-07-02 16:33:02

标签: c# performance linq

我只想知道在从Array调用ToArray()时,LINQ的实现是否可以保护开发人员免受性能影响。

例如,

var array1 = Enumerable.Range(0,short.MaxValue).ToArray(); //does the actual copy
var array2 = array1.ToArray() //is this the same object as array1?
var array3 = ((IEnumerable<int>)array2).ToArray() //what about this?

这三个ToArray()调用是否都具有相同的性能影响?

这样的其他问题已经解决了ToArray()的一般性能影响,

Is it better to call ToList() or ToArray() in LINQ queries?

Linq ToList/ToArray/ToDictionary performance

但我很好奇实施是否足够聪明&#34;如果源是数组,则避免将元素复制到另一个数组。

我打印了数组1,2和3中的所有哈希码。

    Console.WriteLine(array1.GetHashCode());
    Console.WriteLine(array2.GetHashCode());
    Console.WriteLine(array3.GetHashCode());

得到了

62476613 11404313 64923656

由于哈希码都不同,这是否意味着复制操作都发生了三次?

2 个答案:

答案 0 :(得分:2)

  

数组中的ToArray()是否会自行返回?

不,它没有。它返回数组的新副本,每个元素都复制到新数组。

  

这三个ToArray()调用都具有相同的性能   影响?

第一个:Enumerable.Range(0,short.MaxValue).ToArray();IEnumerable<T>创建一个数组。

第二个:var array2 = array1.ToArray(),它将创建一个新数组,每个元素都复制到array2,因此array1array2将有不同的引用。

第三个:var array3 = ((IEnumerable<int>)array2).ToArray()只是冗余代码,因为数组已经是IEnumerable<int>所以将它投射到它不会产生任何影响。

答案 1 :(得分:1)

  

数组中的ToArray()是否会自行返回?

我会拒绝,因为MSDN自己的话:

  

从IEnumerable创建一个数组。