2015-07-02 4 views
0

Я просто хочу знать, защищает ли разработчик LINQ разработчик от производительности при вызове ToArray() из массива.Верно ли 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

Поскольку хэш-коды все разные, что это значит, что операция копирования произошла все три раза?

+0

No Shortcut. См. Http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,783a052330e7d48d, ссылки – Ralf

+0

Нет, он всегда возвращает новую копию http://stackoverflow.com/questions/2092811/does- array-toarray-return-the-original-array-if-it-the-the-same-type – keyboardP

+1

Вы уже указали в вопросе, что разные массивы возвращены, так почему вы задаете вопрос, вы уже получили ответ? – Servy

ответ

2

Does 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>, поэтому его использование не будет иметь никакого значения.

Смежные вопросы