Dela via


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

Ingen åtgärd krävs från utvecklarens sida.

Berörda API:er