LINQ to Objects - любой выигрыш в производительности при использовании ToArray / ToList по сравнению с IEnumerable<string>
Это почти несомненно тупой вопрос. В мою защиту я болен. Тем не мение.
У меня есть список объектов в памяти. Я использовал следующее выражение, чтобы извлечь интересующие меня строки из моего списка объектов:
var myStrings = myListOfObjects.Select(r => r.MyString);
Это дает мне IEnumerable строки. myStrings будет многократно использоваться в моем коде позже. Что мне интересно, так это то, есть ли какое-либо преимущество в производительности при выполнении ToArray или ToList (то есть "жадного" оператора) для этого до его использования? (Таким образом, мои операции были бы непосредственно против Массива / Списка.)
Для чего стоит myStrings будет повторно использоваться полностью, когда он используется.
3 ответа
Это компромисс между скоростью и космосом.
Если твой Select()
обратный вызов требует значительных вычислительных ресурсов, вы, вероятно, захотите запрограммировать его один раз и сохранить на потом.
Если нет, вы, вероятно, захотите сэкономить на хранилище и вычислять его каждый раз.
Если вам нужен произвольный доступ, обязательно позвоните ToList()
, так как ElementAt()
является O(n).
Обратите внимание, что ToList()
быстрее чем ToArray()
, так как ToArray()
нужно обрезать массив после его завершения.
myStrings
это просто запрос, а не коллекция. Если вам это нужно несколько раз и оно не слишком большое (для памяти), вам лучше создать коллекцию с помощью ToArray
или же ToList
,
В противном случае вы выполняете запрос каждый раз, когда получаете к нему доступ (например, через foreach
) из-за отложенного исполнения. Это также может вызвать неприятные ошибки, если запрос теперь возвращает другой результат.
Оставьте его IEnumerable будет лучшим, если вам не нужны функции List или Array. Нет приведения == меньше вычислительных циклов.