Załóżmy, że mam listę elementów (np. Posty) i chcę znaleźć pierwszy element zgodnie z niektórymi niebanalnymi zamówieniami (np. PublishDate, a następnie CommentCount jako łamacz). Naturalny sposób to zrobić z LINQ jest tak:Jak znaleźć pierwszy element zgodnie z konkretnym zamówieniem przy użyciu LINQ w O (n)?
posts.OrderBy(post => post.PublishDate).ThenBy(post => post.CommentsCount).First()
jednak mikro-optymalizator we mnie martwi, że nazywając orderby faktycznie kosztuje mnie O (n * LGN) do sortowania całą listę, gdy wszystkie Naprawdę potrzebuję operacji minimum O (n) find.
Czy LINQ jest wystarczająco inteligentny, aby zwrócić coś od OrderBy(), który wie, jak zoptymalizować kolejne wywołania First()? Jeśli nie, jaki jest lepszy sposób na zrobienie tego po wyjęciu z pudełka? (Zawsze mogę napisać własną implementację FindMinimumItem, ale to wydaje się przesadą).
jeśli klucz jest faktycznie jak wydrukowano, że nie potrzebujesz elementu ThenBy, ale możesz zamiast tego utworzyć klucz coumpund z dwóch. Co byłoby łatwe, ponieważ pierwsza z nich to długa (tyka) lub ustalona z ciągiem. a to może być O (n), o które prosisz, ale potem znowu nie ma garanty, że O (n) jest szybsze niż O (nlogn) –