Sdílet prostřednictvím


Složitost LINQ OrderBy.First{OrDefault} byla zvýšena.

OrderBy.First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) Implementace a OrderBy.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) změna, což vede ke zvýšení složitosti operace.

Změna popisu

V .NET Core 1.x – 3.x, volání OrderBy nebo OrderByDescending následované First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) nebo FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) pracuje se složitostí O(N) . Vzhledem k tomu, že je vyžadován pouze první (nebo výchozí) prvek, je k jeho nalezení vyžadován pouze jeden výčet. Predikát, který je zadán First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) nebo FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) je vyvolán přesně N čas, kde N je délka sekvence.

V .NET 5 a novějších verzích byla provedena změna tak, aby volala OrderBy nebo OrderByDescending následovala First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) nebo FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) fungovala se složitostí O(N log N) místo O(N) složitosti. Predikát zadaný First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) nebo FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) může být vyvolán méně než N časy, což je důležitější pro celkový výkon.

Poznámka:

Tato změna odpovídá implementaci a složitosti operace v rozhraní .NET Framework.

Důvod změny

Výhoda vyvolání predikátu méněkrát převáží nižší celkovou složitost, takže implementace, která byla zavedena v .NET Core 1.0, se vrátila zpět. Další informace najdete v tomto problému s dotnet/runtime.

Zavedená verze

5,0

Na straně vývojáře není nutná žádná akce.

Ovlivněná rozhraní API