Komplexiteten i LINQ OrderBy.First{OrDefault} har ökat
Implementeringen av OrderBy.
First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) och OrderBy.
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) har ändrats, vilket resulterar i ökad komplexitet för åtgärden.
Ändra beskrivning
I .NET Core 1.x – 3.x anropar OrderBy eller OrderByDescending följs av First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) eller FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) fungerar med O(N)
komplexitet. Eftersom endast det första (eller standard) elementet krävs krävs bara en uppräkning för att hitta det. Men predikatet som anges till First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) eller FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) anropas exakt N
gånger, där N
är längden på sekvensen.
I .NET 5 och senare versioner gjordes en ändring så att anrop OrderBy eller OrderByDescending följt av First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) eller FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) fungerar med O(N log N)
komplexitet i stället för O(N)
komplexitet. Men predikatet som tillhandahålls till First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) eller FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) kan anropas mindre än N
gånger, vilket är viktigare för övergripande prestanda.
Kommentar
Den här ändringen matchar implementeringen och komplexiteten i åtgärden i .NET Framework.
Orsak till ändringen
Fördelen med att anropa predikatet färre gånger uppväger en lägre övergripande komplexitet, så implementeringen som introducerades i .NET Core 1.0 återställdes. Mer information finns i det här dotnet/runtime-problemet.
Version introducerad
5,0
Rekommenderad åtgärd
Ingen åtgärd krävs från utvecklarens sida.