Что делает метод CopyTo в C# и как его использовать?

«Что делает метод CopyTo в C# и как его использовать?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CopyTo — это метод, доступный для типов, реализующих интерфейс ICollection (например, массивы T[], List<T>, Dictionary<TKey, TValue>.KeyCollection). Его задача — скопировать все элементы текущей коллекции в указанный одномерный массив, начиная с заданного индекса в целевом массиве.

Ключевые характеристики:

  • Копирует в существующий массив: Метод не создает новый массив, а заполняет предоставленный вами.
  • Требует достаточной емкости: Целевой массив должен быть уже инициализирован и иметь достаточную длину, начиная с указанного индекса arrayIndex.
  • Сигнатура: void CopyTo(T[] array, int arrayIndex)

Типичный пример использования:

// Исходная коллекция
List<string> sourceList = new List<string> { "A", "B", "C" };

// Целевой массив должен быть достаточного размера
string[] targetArray = new string[6]; // { null, null, null, null, null, null }

// Копируем все элементы из sourceList в targetArray, начиная с индекса 2
sourceList.CopyTo(targetArray, 2);

// Результат: targetArray = { null, null, "A", "B", "C", null }
Console.WriteLine(string.Join(", ", targetArray));

Какие исключения может выбросить:

  • ArgumentNullException: если параметр array равен null.
  • ArgumentOutOfRangeException: если arrayIndex меньше 0.
  • ArgumentException**: **Наиболее частая ошибка.** Возникает, если в целевом массиве, начиная сarrayIndex`, недостаточно места для размещения всех элементов исходной коллекции.
    int[] smallArray = new int[2];
    int[] bigList = { 1, 2, 3, 4 };
    bigList.CopyTo(smallArray, 0); // ArgumentException: Длина целевого массива недостаточна.

Альтернативы и сравнение:

  • ToArray(): Создает новый массив со всеми элементами. Удобно, когда не нужно управлять целевым массивом.
    int[] newArray = sourceList.ToArray();
  • Array.Copy(): Статический метод для копирования между массивами, поддерживает копирование части массива.
  • Для List<T>: Метод AddRange() добавляет элементы в конец списка, а не в массив по индексу.