【问题标题】:Does ToArray() from an array return itself? [duplicate]数组中的 ToArray() 是否返回自身? [复制]
【发布时间】:2015-07-02 16:33:02
【问题描述】:

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

例如,

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

但我很好奇实现是否“足够智能”以避免在源是数组的情况下将元素复制到另一个数组。

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

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

得到了

62476613 11404313 64923656

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

【问题讨论】:

标签: c# performance linq


【解决方案1】:

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

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

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

第一个:Enumerable.Range(0,short.MaxValue).ToArray(); 从IEnumerable&lt;T&gt; 创建一个数组。

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

第三个:var array3 = ((IEnumerable&lt;int&gt;)array2).ToArray() 只是冗余代码,因为数组已经是IEnumerable&lt;int&gt;,所以将其转换为它不会有任何区别。

【讨论】:

    【解决方案2】:

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

    我会说不,因为 MSDN 自己的话:

    从 IEnumerable 创建一个数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多