Почему я хотел бы положить свои вещи в сумку?
Я только что увидел ТАК вопрос о System.Collections.ConcurrentBag<T>
класс, и я видел ViewBag
собственность Controller
в ASP.NET MVC. Исходя из своего опыта, я понял, что легче использовать код людей, если вы понимаете, к чему именно они стремились при его написании. Я думаю, что это довольно интуитивно понятно, что List<T>
или Dictionary<TKey,TValue>
или ReadOnlyCollection<T>
предназначены для представления. Bag
с другой стороны, не так интуитивно понятно.
Итак, мой вопрос: что это Bag
метафора предназначена для представления, особенно в отношении.NET Framework?
3 ответа
ConcurrentBag<T>
это потокобезопасная, неупорядоченная последовательность элементов, которая может включать дубликаты.
По сравнению с некоторыми другими коллекциями:
- Это неупорядочено, как
HashSet<T>
но в отличие отList<T>
- Он может содержать дубликаты, такие как
List<T>
но в отличие отHashSet<T>
- Это просто значения, а не карта (в отличие
Dictionary<TKey, TValue>
) - Он ориентирован на многопотоковое исполнение, в отличие от всех несовпадающих коллекций, поэтому вы можете делить экземпляр между несколькими потоками, для чтения и записи.
Возможное использование включает рабочую очередь, где вы не заботитесь о порядке (в противном случае вы бы использовали ConcurrentQueue
/ ConcurrentStack
) или список элементов, к которым вы всегда будете применять порядок сортировки после извлечения данных в другую "локальную" коллекцию.
Из первой строки документации MSDN:
Представляет потокобезопасную неупорядоченную коллекцию объектов.
Я не думаю, что это менее интуитивно, чем "Список" или "ReadOnlyCollection", на самом деле - YMMV.
ConcurrentBag - это то же самое, что ConcurrentStack и ConcurrentQueue, за исключением того, что он не поддерживает порядок по соображениям производительности, в этой статье это объясняется более подробно http://www.emadomara.com/2011/08/what-is-concurrentbag.html