Зачем мне класть мои предметы в сумку? - PullRequest
2 голосов
/ 21 марта 2011

Я только что увидел вопрос SO о классе System.Collections.ConcurrentBag<T> и видел свойство ViewBag Controller в ASP.NET MVC. По своему опыту я узнал, что легче использовать код людей, если вы понимаете, к чему именно они стремились при его написании. Я думаю, что довольно интуитивно понятно, что означают List<T> или Dictionary<TKey,TValue> или ReadOnlyCollection<T>. А Bag с другой стороны не так интуитивно понятен.

Итак, мой вопрос: Что означает эта метафора Bag, особенно в отношении .NET Framework?

Ответы [ 3 ]

6 голосов
/ 21 марта 2011

ConcurrentBag<T> - это потокобезопасная, неупорядоченная последовательность элементов, которая может содержать дубликаты.

По сравнению с некоторыми другими коллекциями:

  • Она неупорядочена, как HashSet<T> но в отличие от List<T>
  • Может содержать дубликаты, например List<T>, но в отличие от HashSet<T>
  • Это просто значения, а не карта (в отличие от Dictionary<TKey, TValue>)
  • Это потокобезопасный, в отличие от всех непараллельных коллекций - так что вы можете разделить экземпляр между несколькими потоками, всеми чтениями и записью.

Возможное использование включает рабочую очередь, в которой вы не работаетене волнует порядок (в противном случае вы бы использовали ConcurrentQueue / ConcurrentStack) или список элементов, к которым вы всегда будете применять порядок сортировки после извлечения данных в другую «локальную» коллекцию.

0 голосов
/ 12 августа 2011

ConcurrentBag - это то же самое, что ConcurrentStack и ConcurrentQueue, за исключением того, что он не поддерживает порядок по соображениям производительности, в этой статье это объясняется более подробно http://www.emadomara.com/2011/08/what-is-concurrentbag.html

0 голосов
/ 21 марта 2011

Из первой строки документации MSDN:

Представляет потокобезопасный неупорядоченный набор объектов.

Я не думаю, что это менее интуитивно понятно, чем «List» или «ReadOnlyCollection», на самом деле - YMMV.

...