Share via


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>) 的述詞可能會受叫用「少於」N 次,這對整體效能來講更為重要。

注意

此變更與 .NET Framework 中作業的實作和複雜性相符。

變更原因

叫用述詞的優點比整體複雜度較低,因此已還原 .NET Core 1.0 中引進的實作。 如需詳細資訊,請參閱此 dotnet/runtime 問題

導入的版本

5.0

開發人員無須採取任何動作。

受影響的 API