Я нахожусь в процессе преобразования старой библиотеки C ++ в C #.
Библиотека C ++ сильно зависит от перезапись определенные элементы std::vector<T>
используя memcpy(&source[d_index],&source[s_index],count*sizeof(<T>));
(обратите внимание, что источник и цель здесь одинаковы, только разные индексы)
Мой C # порт этого (путем реализации ICloneable
а также source
очевидно, будучи List<T>
где T
является ссылочным типом)
for (int i = 0; i < count; i++)
source[d_index + i] = source[s_index + i].Clone();
Это работает как положено.
Тем не менее, мой вопрос: есть ли более простая версия? Я явно не могу использовать List.InsertRange(d_index, List.GetRange(s_index, count))
потому что этот метод вставки вместо перезаписи.
Я не могу использовать List<T>.CopyTo Method (Int32, T[], Int32, Int32)
либо в качестве пункта назначения должен быть массив T[]
а не сам список.
Есть ли метод, который делает то, что memcpy
делает для этого конкретного примера? Я знаю, что могу легко реализовать метод расширения самостоятельно, мне просто интересно, пропустил ли я что-то в MSDN.
Я сам столкнулся с этой проблемой и пришел к такому же выводу: либо используйте Clone, либо создайте конструктор копирования самостоятельно.
Для метода CopyTo я забыл, но разве он просто не копирует ссылки снова? Кроме того, вы можете сохранить их в массив, как вы сказали, и использовать AddRange (массив).
Как насчет RemoveRange, а затем вставить диапазон? Очевидно, только если диапазоны не перекрываются.