IEnumerable.ToList()
Да, IEnumerable<T>.ToList()влияет на производительность, это операция O (n), хотя она, вероятно, потребует внимания только в критических для производительности операциях.
В ToList()операции будет использоваться List(IEnumerable<T> collection)конструктор. Этот конструктор должен делать копию массива (в более общем смысле IEnumerable<T>), в противном случае будущие модификации исходного массива также изменятся в источнике, T[]что в целом нежелательно.
Я хотел бы повторить, что это будет иметь значение только для огромного списка, копирование фрагментов памяти - довольно быстрая операция.
Подсказка, AsvsTo
Вы заметите, что в 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[]если это сделает код более логичным / читаемым / поддерживаемым (если, конечно, преобразование не вызывает заметных проблем с производительностью, и в этом случае я бы повторно посети это я думаю).