День 2806. #ЗаметкиНаПолях
Типы Коллекций в .NET, Которые Стоит Попробовать. Начало
Большинство разработчиков ежедневно используют List и Dictionary. Однако в .NET есть и специализированные коллекции, способные сделать код быстрее, безопаснее и проще в сопровождении. Рассмотрим некоторые из них, о которых стоит знать каждому .NET-разработчику.
1. HashSet
Многие разработчики используют List для проверки наличия элемента.
if(users.Contains(id))
Проблема в том, что List.Contains() выполняет линейный поиск. HashSet использует хэширование для гораздо более быстрого поиска:
var permissions =
new HashSet
{
"Read",
"Write",
"Delete"
};
Console.WriteLine(
permissions.Contains("Write"));
Где использовать:
- выявление дубликатов,
- проверка наличия прав доступа,
- быстрый поиск.
См. подробнее про HashSet
2. PriorityQueue
Нужно первым делом обработать элемент с наивысшим приоритетом?
Вместо того чтобы постоянно сортировать список, используйте PriorityQueue:
var queue = new PriorityQueue();
queue.Enqueue("Low", 3);
queue.Enqueue("Medium", 2);
queue.Enqueue("High", 1);
while (queue.Count > 0)
Console.WriteLine(queue.Dequeue());
// Вывод:
// High
// Medium
// Low
Где использовать:
- планировщики заданий,
- обработка задач,
- алгоритмы маршрутизации,
- поиск пути в системах ИИ,
- моделирование событий.
См. подробнее про PriorityQueue
3. ConcurrentDictionary
Обычный словарь (Dictionary) не является потокобезопасным. Если несколько потоков будут одновременно читать и записывать данные, это неизбежно приведёт к возникновению исключений или нарушению целостности данных.
ConcurrentDictionary решает эту проблему:
using System.Collections.Concurrent;
var cache = new ConcurrentDictionary();
Parallel.For(0, 1000, i =>
{
cache.TryAdd(i, $"User {i}");
});
Console.WriteLine(cache.Count);
Почему не использовать блокировку?
Вместо:
lock(_lock)
{
dictionary.Add(...);
}
Используйте:
cache.TryAdd(key, value);
- яснее,
- быстрее,
- безопаснее.
Где использовать:
- кэширование,
- фоновые сервисы,
- параллельная обработка.
См. также Использование потокобезопасных коллекций
Окончание следует…
Источник: https://medium.com/turbo-net/7-dotnet-collections-youre-probably-not-using-but-should-a76437aa6a62
Типы Коллекций в .NET, Которые Стоит Попробовать. Начало
Большинство разработчиков ежедневно используют List и Dictionary. Однако в .NET есть и специализированные коллекции, способные сделать код быстрее, безопаснее и проще в сопровождении. Рассмотрим некоторые из них, о которых стоит знать каждому .NET-разработчику.
1. HashSet
Многие разработчики используют List для проверки наличия элемента.
if(users.Contains(id))
Проблема в том, что List.Contains() выполняет линейный поиск. HashSet использует хэширование для гораздо более быстрого поиска:
var permissions =
new HashSet
{
"Read",
"Write",
"Delete"
};
Console.WriteLine(
permissions.Contains("Write"));
Где использовать:
- выявление дубликатов,
- проверка наличия прав доступа,
- быстрый поиск.
См. подробнее про HashSet
2. PriorityQueue
Нужно первым делом обработать элемент с наивысшим приоритетом?
Вместо того чтобы постоянно сортировать список, используйте PriorityQueue:
var queue = new PriorityQueue();
queue.Enqueue("Low", 3);
queue.Enqueue("Medium", 2);
queue.Enqueue("High", 1);
while (queue.Count > 0)
Console.WriteLine(queue.Dequeue());
// Вывод:
// High
// Medium
// Low
Где использовать:
- планировщики заданий,
- обработка задач,
- алгоритмы маршрутизации,
- поиск пути в системах ИИ,
- моделирование событий.
См. подробнее про PriorityQueue
3. ConcurrentDictionary
Обычный словарь (Dictionary) не является потокобезопасным. Если несколько потоков будут одновременно читать и записывать данные, это неизбежно приведёт к возникновению исключений или нарушению целостности данных.
ConcurrentDictionary решает эту проблему:
using System.Collections.Concurrent;
var cache = new ConcurrentDictionary();
Parallel.For(0, 1000, i =>
{
cache.TryAdd(i, $"User {i}");
});
Console.WriteLine(cache.Count);
Почему не использовать блокировку?
Вместо:
lock(_lock)
{
dictionary.Add(...);
}
Используйте:
cache.TryAdd(key, value);
- яснее,
- быстрее,
- безопаснее.
Где использовать:
- кэширование,
- фоновые сервисы,
- параллельная обработка.
См. также Использование потокобезопасных коллекций
Окончание следует…
Источник: https://medium.com/turbo-net/7-dotnet-collections-youre-probably-not-using-but-should-a76437aa6a62