Die Komplexität von OrderBy.First{OrDefault} in LINQ wurde erhöht

Die Implementierung von OrderBy.First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) und OrderBy.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) wurde geändert, wodurch die Komplexität des Vorgangs erhöht wurde.

Änderungsbeschreibung

In .NET Core 1.x bis 3.x werden Aufrufe von OrderBy oder OrderByDescending gefolgt von First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) oder FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) mit der Komplexität O(N) durchgeführt. Da nur das erste Element (oder das Standardelement) erforderlich ist, ist nur eine Enumeration erforderlich, um es zu finden. Allerdings wird das für First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) oder FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) bereitgestellte Prädikat genau N Mal aufgerufen. Dabei entspricht N der Länge der Sequenz.

In .NET 5 und höheren Versionen wurde eine Änderung eingeführt, durch die Aufrufe von OrderBy oder OrderByDescending gefolgt von First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) oder FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) mit der Komplexität O(N log N) anstelle von O(N) durchgeführt werden. Allerdings kann das für First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) oder FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) bereitgestellte Prädikat weniger als N Mal aufgerufen werden, was für die Gesamtleistung wichtiger ist.

Hinweis

Diese Änderung entspricht der Implementierung und Komplexität des Vorgangs im .NET Framework.

Grund für die Änderung

Der Vorteil weniger Aufrufe des Prädikats überwiegt geringere Gesamtkomplexität, daher wurde die in .NET Core 1.0 eingeführte Implementierung rückgängig gemacht. Weitere Informationen finden Sie in diesem Dotnet-/Runtime-Issue.

Eingeführt in Version

5.0

Der Entwickler muss keine Maßnahmen ergreifen.

Betroffene APIs