Является FirstOrDefault/First и OrderByDescending, быстрее, чем LastOrDefault/Last и OrderBy?
У меня был вопрос LINQ, я задавался вопросом, знает ли кто-нибудь ответ.
Обычно, если бы я хотел найти запись, заказанную определенным полем, например, "последний добавленный человек", я бы написал что-то вроде:
MyCollection.OrderByDescending(x => x.AddedDate).FirstOrDefault();
Недавно я взял работу от другого Dev в команде, которая предпочитает писать:
MyCollection.OrderBy(x => x.AddedDate).LastOrDefault();
Поэтому мой вопрос заключается в том, что вы заказываете нисходящий и выбираете первый, более быстрый или медленный, чем заказываете другое направление и выбираете последний?
Мои мысли состоят в том, что сначала было бы быстрее, поскольку не нужно перебирать коллекцию "как можно дальше" при возвращении объекта, но это скорее догадка, чем что-либо еще!
Ответы
Ответ 1
Если вы используете LINQ-to-Objects, первый будет немного быстрее. Каждый из двух типов будет принимать одинаковое количество времени *, но вы правы, думая, что FirstOrDefault
быстрее, чем LastOrDefault
. Однако разница будет незначительной по сравнению с временем, которое занимает сортировка.
(Обратите внимание, что выполнение всего сортировки, чтобы взять только верхний элемент, гораздо более неэффективно, чем использование Last
over First
, подумайте о том, чтобы реализовать что-то вроде функции MoreLINQ MaxBy
чтобы получить элемент, который вы хотите в O(n)
, а не O(n log n)
, время.)
Если вы используете LINQ-to-something else (SQL, Entities), это, вероятно, ничего не изменит.
* в целом; как указывает РБ, это может быть не так, если данные уже упорядочены в некоторой степени.