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. Нет приведения == меньше вычислительных циклов.

Другие вопросы по тегам