Является 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), это, вероятно, ничего не изменит.

* в целом; как указывает РБ, это может быть не так, если данные уже упорядочены в некоторой степени.