IEnumerable.ToList()
Да, IEnumerable<T>.ToList()
влияет на производительность, это операция O (n), хотя она, вероятно, потребует внимания только в критических для производительности операциях.
В ToList()
операции будет использоваться List(IEnumerable<T> collection)
конструктор. Этот конструктор должен делать копию массива (в более общем смысле IEnumerable<T>
), в противном случае будущие модификации исходного массива также изменятся в источнике, T[]
что в целом нежелательно.
Я хотел бы повторить, что это будет иметь значение только для огромного списка, копирование фрагментов памяти - довольно быстрая операция.
Подсказка, As
vsTo
Вы заметите, что в LINQ есть несколько методов, которые начинаются с As
(например, AsEnumerable()
) и To
(например, ToList()
). Методы, которые начинаются с, To
требуют преобразования, как указано выше (т. Е. Могут повлиять на производительность), а методы, которые начинаются с As
, не требуют и просто требуют некоторого приведения или простой операции.
Дополнительная информация о List<T>
Вот еще немного подробностей о том, как List<T>
работает, если вам интересно :)
A List<T>
также использует конструкцию, называемую динамическим массивом, размер которого необходимо изменять по требованию, это событие изменения размера копирует содержимое старого массива в новый массив. Таким образом, он начинается с малого и при необходимости увеличивается в размерах .
Это разница между Capacity
и Count
атрибутами на List<T>
. Capacity
относится к размеру скрытого массива, Count
это количество элементов, List<T>
которое всегда есть <= Capacity
. Поэтому, когда элемент добавляется в список, увеличивая его Capacity
, размер List<T>
удваивается, и массив копируется.
List<T>
в пользу a,T[]
если это сделает код более логичным / читаемым / поддерживаемым (если, конечно, преобразование не вызывает заметных проблем с производительностью, и в этом случае я бы повторно посети это я думаю).