var dict = largeListOfItems.DistinctBy(item => item.KeyId).ToDictionary(item => item.KeyId);
Внезапно оказалось, что этот код:
1. Аллоцирует внутри DistinctBy хешмепу
2. Причем размер ее не берется из размера largeListOfItems, а задается дефолтный, т.е. по мере прохождения по листу несколько раз реаллоцируется
3. DistinctBy наружу отдает IEnumerable, следовательно ToDictionary не знает размера входящей коллекции и реаллоцирует словарь несколько раз.
Поскольку лист большой, это несколько раз оказывается в Large Object Heap и благополучно там живет до следующего Gen2
Нужен вариант ToDictionary c встроенным Distinct (ну или руками его написать)
https://github.com/dotnet/runtime/issues/113096
GitHub
[API Proposal]: Enhance ToDictionary with Duplicate Key Handling Options · Issue #113096 · dotnet/runtime
Background and motivation The Enumerable.ToDictionary extension method is a highly convenient way to convert a collection into a dictionary. However, its current implementation immediately throws a...
👍2