List<T>
не является производным от Collection<T>
- однако он реализует ICollection<T>
. Это был бы лучший выбор типа возврата.
Что касается вопроса new List<int>(some collection<int>)
- это частично зависит от того, что представляет собой коллекция. Если он реализует ICollection<T>
(во время выполнения), тогда конструктор может использовать свое свойство Count
для создания списка с правильной начальной емкостью, прежде чем выполнять итерацию по нему и добавлять каждый элемент. Если он не реализует ICollection<T>
, то это просто эквивалентно:
List<int> list = new List<int>();
foreach (int x in otherCollection)
{
list.Add(x);
}
По-прежнему приятно иметь удобный конструктор, но не очень эффективный - на самом деле этого не может быть.
Я не верю, что конструктор делает что-то хитрое для массивов, что он потенциально мог бы - используя Array.Copy
или что-то еще, чтобы просто скопировать лот за один раз, а не выполнять итерации. (Аналогично, если бы это был другой List<T>
, он мог бы получить в резервном массиве и скопировать его напрямую.)