Существует простой способ сделать это преобразование, не оставляя себя или кого-либо под сомнением читающего ваш код: используйте LINQ.
OldType[] oldArray = /* Some logic */;
NewType[] newArray = oldArray.Select(old => new NewType(old)).ToArray();
В качестве документации здесь (указано М.Бэбкок в комментариях) говорит, что Array.Copy
- это операция O (n).Аналогично, код LINQ, который я написал выше, является операцией O (n), поэтому нет асимптотического снижения производительности (фактическая производительность во время настенных часов зависит от множества факторов, поэтому я не могу сравнить время выполнения двух решенийбез профилирования), и вы знаете, что этот код правильный.
Также из документов MSDN:
Если sourceArray и destinationArray оба массива ссылочного типа или оба являются массивами типа Object, выполняется поверхностное копирование.Мелкая копия массива - это новый массив, содержащий ссылки на те же элементы, что и исходный массив.Сами элементы или все, на что ссылаются элементы, не копируются.Напротив, глубокая копия массива копирует элементы и все, на что прямо или косвенно ссылаются элементы.
Так что нет, Array.Copy не будет «автоматически конвертировать», то есть фактически создавать новые объектыво время копирования введите NewType
, но просто скопируйте ссылки на объекты типа OldType
и поместите эти ссылки в newArray
.