我只想知道在从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
由于哈希码都不同,这是否意味着复制操作都发生了三次?
答案 0 :(得分:2)
数组中的ToArray()是否会自行返回?
不,它没有。它返回数组的新副本,每个元素都复制到新数组。
这三个ToArray()调用都具有相同的性能 影响?
第一个:Enumerable.Range(0,short.MaxValue).ToArray();
从IEnumerable<T>
创建一个数组。
第二个:var array2 = array1.ToArray()
,它将创建一个新数组,每个元素都复制到array2
,因此array1
和array2
将有不同的引用。
第三个:var array3 = ((IEnumerable<int>)array2).ToArray()
只是冗余代码,因为数组已经是IEnumerable<int>
所以将它投射到它不会产生任何影响。
答案 1 :(得分:1)
数组中的ToArray()是否会自行返回?
我会拒绝,因为MSDN自己的话:
从IEnumerable创建一个数组。