La complexité de LINQ OrderBy.First{OrDefault} a augmenté
L’implémentation de OrderBy.
First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) et OrderBy.
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) a changé, ce qui a entraîné une complexité accrue pour l’opération.
Description de la modification
Dans .NET Core 1.x - 3.x, l’appel OrderBy ou OrderByDescending suivi de First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ou FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) fonctionne avec la complexité O(N)
. Étant donné que seul le premier élément (ou celui par défaut) est requis, une seule énumération est requise pour le trouver. Toutefois, le prédicat fourni à First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ou FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) est appelé exactement N
fois, où N
est la longueur de la séquence.
Dans .NET 5 et versions ultérieures, une modification a été apportée de telle sorte que l’appel à OrderBy ou OrderByDescending suivi de First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ou FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) fonctionne avec la complexité O(N log N)
au lieu de O(N)
. Toutefois, le prédicat fourni à First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ou FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) peut être appelé moins de N
fois, ce qui est plus important pour les performances globales.
Notes
Cette modification correspond à l’implémentation et à la complexité de l’opération dans .NET Framework.
Raison du changement
L’avantage d’appeler le prédicat moins souvent l’emporte sur une complexité globale inférieure, de sorte que l’implémentation introduite dans .NET Core 1.0 a été rétablie. Pour plus d’informations, consultez ce problème dotnet/runtime.
Version introduite
5,0
Action recommandée
Aucune action n’est requise de la part du développeur.