Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание
Начало
4. ReadOnlyDictionary<TKey,TValue>
Иногда требуется, чтобы потребители могли читать словарь, но не могли его изменять. ReadOnlyDictionary служит оболочкой для существующего словаря.
var dict = new Dictionary<int, string>
{
[1] = "One",
[2] = "Two"
};
var readOnly =
new ReadOnlyDictionary<int, string>(dict);
Console.WriteLine(readOnly[1]);
Попытки добавить или удалить элементы через обёртку не допускаются. Это простой способ безопасного предоставления доступа к данным через API «только для чтения».
См. также ReadOnly-Коллекция не Является Неизменяемой
5. ImmutableArray<T>
Иногда требуется коллекция, которую никто не сможет случайно изменить.
Именно это и обеспечивает ImmutableArray<T>:
using System.Collections.Immutable;
ImmutableArray<string> roles =
[
"Admin",
"Manager",
"Employee"
];
foreach (var role in roles)
Console.WriteLine(role);
Попытка изменить объект создаёт новый экземпляр вместо модификации исходного. Благодаря этому код становится гораздо проще анализировать.
Где использовать:
- конфигурации;
- доменные модели;
- разделяемое (shared) состояние приложения.
См. также
- Неизменяемые стеки и очереди
- Неизменяемые списки
- Неизменяемые множества
- Неизменяемые словари
6. FrozenDictionary<TKey,TValue>
Класс FrozenDictionary, появившийся в .NET 8, предназначен для хранения данных, которые не изменяются после создания. После инициализации коллекция становится неизменяемой и высокооптимизированной для операций поиска. Если ваше приложение при запуске загружает конфигурационные данные, коды стран, категории товаров или любые другие наборы данных, предназначенные только для чтения, эта коллекция может значительно превзойти по производительности обычный Dictionary:
using System.Collections.Frozen;
var countries = new Dictionary<string, string>
{
["US"] = "United States",
["IN"] = "India",
["JP"] = "Japan"
};
FrozenDictionary<string, string> frozen =
countries.ToFrozenDictionary();
Console.WriteLine(frozen["IN"]);
Зачем?
- более быстрый поиск,
- потокобезопасность после создания,
- оптимизированное размещение в памяти.
Где использовать:
- конфигурации,
- справочные данные,
- таблицы поиска (lookup tables),
- статические кэши.
См. подробнее о замороженных коллекциях
Итого
В следующий раз, когда вы захотите использовать
List<T> или Dictionary<TKey, TValue>, остановитесь на мгновение и спросите себя:Существует ли коллекция, которая лучше подходит для этой задачи? Вы удивитесь, как часто ответ будет утвердительным.
Современная платформа .NET предлагает специализированные коллекции практически для любого сценария. Изучение того, когда их следует применять, — это небольшое вложение усилий, которое может существенно повлиять на качество и производительность ваших приложений.
Иногда самые значительные улучшения достигаются не за счёт написания дополнительного кода, а благодаря выбору подходящей структуры данных.
Источник: https://medium.com/turbo-net/7-dotnet-collections-youre-probably-not-using-but-should-a76437aa6a62