2013-11-08 3 views
0

Я пытаюсь найти самый быстрый способ вернуть часть массива в C# Мой текущий путь выглядит следующим образом:Возврат части массива

// .. set int moveCount .. 
// .. set int[] childArray .. 
int[] realArray = new int[moveCount]; 
Array.Copy(childArray, realArray, moveCount); 
return realArray; 

Это, как я вижу это везде в сети , но Интересно, будет ли массив теперь копироваться дважды. Однажды, потому что я это делаю, и один раз из-за возвращения.

  • Это правильное предположение ?.
  • Есть ли лучший способ? Я знаю о Buffer.BlockCopy.

ответ

8

Нет, когда вы вернетесь» Будем возвращать ссылку в массив, который вы только что создали. Ссылка будет скопирована, но это дешево.

Все массивы являются ссылочными типами, даже если элемент тип массива является типом значения (так int[] является ссылочным типом, даже если int является типом значения).

Теперь вы можете еще рассмотреть возможность возвращения ArraySegment<int> вместо int[] - таким образом, вы не в конечном итоге копирования любые значения в массиве. С другой стороны, если исходный массив изменен, эти изменения повлияют на то, что видит вызывающий (а также вызывающий может изменить содержимое массива).

+0

А я ошибочно предполагал, что массивы передаются по значению. Я не всегда получаю его с C#. Спасибо –

+0

@AartStuurman, прочитайте эту статью [Параметр, проходящий в C#] (http://www.yoda.arachsys.com/csharp/parameters.html) от великого человека – Habib

+0

@AartStuurman: Array * ссылки * передаются по значению по умолчанию, как и все другие ссылочные типы. Дело не в том, что массивы передаются по ссылкам - это то, что ссылки передаются по значению. Есть большая разница. –

1

Если звуки, как вы хотите использовать LINQ Take:

return realArray.Take(numberOfItems); 

Примечание: Это работает для принятия первых N элементов в массиве

+1

Я попробую. Он делает то, что мне нужно, но я не знаю, быстрее ли это. –

+1

@AartStuurman: будет ли это быстрее или нет, зависит от того, что вы делаете с результатом. Обратите внимание, что вы возвращаете 'IEnumerable ' вместо 'int []', поэтому вы не можете получить к нему доступ, как массив, только пропустите его. – Guffa

3

Нет, ваше предположение неверно, оператор return возвращает ссылку на созданный массив. Нет, вы не создаете две копии возвращаемого массива. Для части, касающейся блочной копии, я думаю, что ваш Array.Copy - лучший компромисс.

+0

Вот что я подумал. благодаря –

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