Лучше ли вызывать ToList () или ToArray () в запросах LINQ?

Переопределение:

@Override
public void showPopup()
{
    //do nothing
}

должно выполнить трюк.

477
задан Pure.Krome 13 December 2018 в 05:26
поделиться

4 ответа

The memory will always be allocated twice - or something close to that. As you can not resize an array, both methods will use some sort of mechanism to gather the data in a growing collection. (Well, the List is a growing collection in itself.)

The List uses an array as internal storage, and doubles the capacity when needed. This means that by average 2/3 of the items has been reallocated at least once, half of those reallocated at least twice, half of those at least thrice, and so on. That means that each item has by average been reallocated 1.3 times, which is not very much overhead.

Remember also that if you are collecting strings, the collection itself only contains the references to the strings, the strings themselves aren't reallocated.

19
ответ дан 22 November 2019 в 22:43
поделиться

Разница в производительности будет незначительной, поскольку List реализован как массив с динамическим размером. Вызов либо ToArray () (который использует внутренний Buffer

166
ответ дан 22 November 2019 в 22:43
поделиться

TOLIST () обычно предпочтительнее, если вы используете его на IENumerable (например, ORM). Если длина последовательности не известна в начале, Toarray () создает коллекцию динамической длины, как список, а затем преобразует его в массив, который занимает дополнительное время.

19
ответ дан 22 November 2019 в 22:43
поделиться

Изменить : последняя часть этого ответа недействительна. Однако остальная информация по-прежнему полезна, поэтому я оставлю ее.

Я знаю, что это старый пост, но, задав тот же вопрос и проведя небольшое исследование, я нашел кое-что интересное, чем, возможно, стоит поделиться.

Во-первых, я согласен с @mquander и его ответом. Он прав, говоря, что с точки зрения производительности они идентичны.

Однако я использовал Reflector, чтобы взглянуть на методы в пространстве имен расширений System.Linq.Enumerable , и заметил очень распространенную оптимизацию.
По возможности источник IEnumerable приводится к IList или ICollection для оптимизации метода. Например, посмотрите ElementAt (int) .

Интересно, что Microsoft решила оптимизировать только для IList , но не для IList . Похоже, Microsoft предпочитает использовать интерфейс IList .

System.Array реализует только IList , поэтому никакая из этих оптимизаций расширений не получит преимуществ.
Поэтому я считаю, что лучше всего использовать метод .ToList () .
Если вы используете какой-либо из методов расширения или передаете список другому методу, есть вероятность, что он может быть оптимизирован для IList .

15
ответ дан 22 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: