增加了 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 中,调用 OrderBy 或 OrderByDescending(后跟 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 及更高版本中,进行了一项更改,以致于调用 OrderBy 或 OrderByDescending(后跟 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
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈