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

W części dewelopera nie jest wymagana żadna akcja.

Dotyczy interfejsów API