La complessità di LINQ OrderBy.First{OrDefault} è stata aumentata
L'implementazione di OrderBy.
First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) e OrderBy.
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) è cambiata, con conseguente maggiore complessità per l'operazione.
Descrizione delle modifiche
In .NET Core 1.x - 3.x, chiamando OrderBy o OrderByDescending seguito da First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) si opera con complessità O(N)
. Poiché è necessario solo il primo elemento (o predefinito), è necessaria una sola enumerazione per individuarlo. Tuttavia, il predicato fornito a First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) viene richiamato esattamente N
volte, dove N
è la lunghezza della sequenza.
In .NET 5 e versioni successive, è stata apportata una modifica in modo che la chiamata OrderBy o OrderByDescending seguita da First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) opera con funzioni di complessità O(N log N)
anziché con complessità O(N)
. Tuttavia, il predicato fornito a First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) può essere richiamato meno di N
volte, che è più importante per le prestazioni complessive.
Nota
Questa modifica corrisponde all'implementazione e alla complessità dell'operazione in .NET Framework.
Motivo della modifica
Il vantaggio di richiamare il predicato meno volte supera una complessità complessiva inferiore, quindi l'implementazione introdotta in .NET Core 1.0 è stata ripristinata. Per altre informazioni, vedere questo problema di dotnet/runtime.
Versione di introduzione
5.0
Azione consigliata
Non occorre alcuna azione da parte dello sviluppatore.