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
Doporučená akce
Na straně vývojáře není nutná žádná akce.