TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1896 1.58K
День 1551. #ЗаметкиНаПолях
Сокращаем Количество Обращений к Коллекциям
Многие проекты C# содержат множество мест, где разработчики добавляют элементы в коллекции, такие как HashSet и Dictionary. Довольно часто добавляют проверку, чтобы убедиться, находится ли элемент в коллекции. Однако это может быть довольно расточительно, так как методы Add() и TryAdd() в этих коллекциях уже выполняют эту проверку за вас. Посмотрим на некоторые примеры.

1. Работа с HashSet<T>
При написании кода с использованием HashSet<T> есть большая вероятность, что ваш код использует следующий шаблон: проверяет, существует ли элемент в наборе, и, если нет, добавляет его.
var person = new Person("Jon", "Smith");
if (!people.Contains(person))
people.Add(person);

Вам не нужно этого проверять. Если вы посмотрите на исходный код HashSet<T>, вы увидите, что и Constains(), и Add() проверяют, содержит ли набор элемент. Другими словами, вы выполняете одну и ту же операцию дважды.

2. Работа с Dictionary<TKey, TValue>
При работе с экземпляром Dictionary аналогичная проверка обычно делается, используя ContainsKey() и Add():
if (employees.ContainsKey(id))
employees[id] = employee;
else
employees.Add(id, employee);

При использовании индексатора словаря для установки значения, под капотом в Dictionary используется метод TryInsert(), поэтому проверка ContainsKey() лишняя.

Другим распространённым шаблоном является добавление записи только если ключ отсутствует в словаре:
if (!employees.ContainsKey(id))
employees.Add(id, employee);

Для таких случаев Dictionary и Dictionary<TKey, TValue> имеют метод TryAdd(), который делает то же самое:
if (employees.TryAdd(id, employee))
{
… // элемент успешно добавлен
}
else
{
… // элемент с таким ключом уже существует
}

Для получения значений словаря, только если ключ существует, есть метод TryGetValue(key, out value):
// До:
if (employees.ContainsKey(id))
return employees[id];

// После:
if (employees.TryGetValue(id, out var employee))
return employee;

Итого
JetBrains недавно объявили в своём блоге, что новые наборы проверок для анализатора кода в ReSharper и Rider содержат описанные выше проверки и соответствующие быстрые исправления для оптимизации вашей работы с различными типами коллекций за счёт сокращения количества операций поиска в коллекциях. Особенно при работе с большими коллекциями или частом добавлении записей оптимизация шаблона использования повысит производительность вашего кода.

Источник: https://blog.jetbrains.com/dotnet/2023/04/18/reduce-lookups-in-hashset-dictionary-and-other-collections-with-resharper/
  • 👍 37
More from @netdeveloperdiary
  1. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  2. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  3. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
  4. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  5. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  6. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →