增加了 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) 复杂度。 由于只需要第一个(或默认)元素,因此只有一个枚举才能找到它。 但是,提供给 First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 的谓词会被准确调用 N 次,其中 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>)的谓词可能被调用的次数少于,这对整体性能更为重要。

注释

此更改与 .NET Framework 中操作的实现和复杂性一致。

更改原因

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

已引入的版本

5.0

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

受影响的 API