Автоматическое преобразование типов содержимого массива с помощью Array.Copy () - PullRequest
2 голосов
/ 10 марта 2012

Я пытаюсь скопировать несколько массивов в c #, используя метод Array.Copy (). Предполагается, что этот метод автоматически выполняет преобразование типов, однако мне интересно, будет ли он преобразовывать пользовательские типы, если бы я определил конструктор следующим образом:

OldType(){
int param1;
String param2;
}

NewType(OldType old){
setParam1(old.param1);
setParam2(old.param2);
}

OldType oldArray[];
NewType newArray[];

//will this automatically convert???
Array.Copy(oldArray, newArray);

Это для использования при преобразовании устаревшего объекта в новый объект. Содержание точно такое же, имена просто разные.

1 Ответ

0 голосов
/ 10 марта 2012

Существует простой способ сделать это преобразование, не оставляя себя или кого-либо под сомнением читающего ваш код: используйте 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.

...