增加了 LINQ OrderBy.First{OrDefault} 的复杂度

OrderBy.First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)OrderBy.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 的实现已更改,这导致操作复杂度增加。

更改描述

在 .NET Core 1.x 至 3.x 中,调用 OrderByOrderByDescending(后跟 First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>))需处理 O(N) 复杂度。 由于只需要第一个(或默认)元素,因此要找到它,只需要一次枚举。 然而,会精确调用 N 次提供给 First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 的谓词,其中 N 是序列的长度。

在 .NET 5 及更高版本中,进行了一项更改,以致于调用 OrderByOrderByDescending(后跟 First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>))会处理 O(N log N) 复杂度,而不是 O(N) 复杂度。 但是,可调用提供给 First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 的谓词(不超过 N 次),这对整体性能来说更为重要。

注意

这项更改与 .NET Framework 中操作的实现和复杂性相契合。

更改原因

减少谓词调用次数的好处大于降低整体复杂度的好处,因此 .NET Core 1.0 中引入的实现已被还原。 有关详细信息,请参阅此 dotnet/runtime 问题

引入的版本

5.0

开发人员方面无需执行任何操作。

受影响的 API