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)
複雜性運作。 因為只需要第一個 (或預設) 元素,所以只需要一個列舉就能找到它。 不過,提供給 First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 或 FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 的述詞會剛好叫用 N
次,其中 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
建議的動作
開發人員無須採取任何動作。