Zwiększono złożoność linq OrderBy.First{OrDefault}
Implementacja OrderBy.
First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) i OrderBy.
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) uległa zmianie, co zwiększa złożoność operacji.
Opis zmiany
W programie .NET Core 1.x — 3.x wywoływanie OrderBy lub OrderByDescending obserwowanie First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) lub FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) działa ze złożonością O(N)
. Ponieważ wymagany jest tylko pierwszy (lub domyślny) element, tylko jedno wyliczenie jest wymagane do jego znalezienia. Jednak predykat, który jest dostarczany do First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) lub FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) jest wywoływany dokładnie N
razy, gdzie N
jest długość sekwencji.
W wersji .NET 5 i nowszych wprowadzono zmianę, która wywołuje OrderBy lub OrderByDescending następuje po First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) nim lub FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) działa ze złożonością O(N log N)
zamiast O(N)
złożoności. Jednak predykat dostarczony do First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) lub FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) może być wywoływany mniej niż N
razy, co jest ważniejsze dla ogólnej wydajności.
Uwaga
Ta zmiana odpowiada implementacji i złożoności operacji w programie .NET Framework.
Przyczyna wprowadzenia zmiany
Korzyści wynikające z wywołania predykatu mniej razy przeważają nad niższą ogólną złożonością, więc implementacja wprowadzona na platformie .NET Core 1.0 została przywrócona. Aby uzyskać więcej informacji, zobacz ten problem z dotnet/runtime.
Wprowadzona wersja
5,0
Zalecana akcja
W części dewelopera nie jest wymagana żadna akcja.