2011-03-21 37 views
2

我刚刚看到关于System.Collections.ConcurrentBag<T>类的SO问题,并且我在ASP.NET MVC中看到了ControllerViewBag属性。根据我的经验,我已经了解到,如果您明白他们在编写代码时到底使用的是什么,那么使用人员代码会更容易。我认为它很直观地表明List<T>Dictionary<TKey,TValue>ReadOnlyCollection<T>是什么意思。另一方面,Bag并不那么直观。为什么我要把我的物品放在一个袋子里?

所以,我的问题是:这是什么Bag隐喻意味着代表,特别是有关.NET框架?

+0

为什么'名单'直观的解释呢?当我(和其他具有FP背景的人)想到一个列表时,我可能会想到一个头部和一个尾部。更类似于链表的东西。没有随机存取的东西。 – 2011-03-21 12:27:11

+0

@Martinho,看看我对丹的回答的评论 – smartcaveman 2011-03-21 12:35:13

+2

'bag'这​​个词引起了很多混淆。他们应该把它称为ConcurrentCache,但不能,“cache”这个词已经超负荷了。 – 2011-03-21 14:18:54

回答

6

ConcurrentBag<T>是一个线程安全的,无序的项目序列,可以包含重复的项目。

一些其他集合所以比较:

  • 它是无序的,就像一个HashSet<T>但不同的是List<T>
  • 它可以包含重复,像List<T>但不像HashSet<T>
  • 这只是价值而非一个地图(不像Dictionary<TKey, TValue>
  • 它是线程安全的,不像所有的非并发集合 - 所以你可以在多个线程之间共享一个实例,全部读取d写作。

可能的用途包括工作队列,你不关心排序(否则你会使用ConcurrentQueue/ConcurrentStack)或项目的列表,你总是获取数据后应用排序次序进入另一个“本地”收藏。

+1

由于无序,它是否比'List '工作更快? – smartcaveman 2011-03-21 12:26:42

+0

@smartcaveman:重点在于它是线程安全的 - 因此您不需要取出所有在多线程之间安全共享'List '所需的锁。我会更新我的答案... – 2011-03-21 12:33:59

+0

@Jon,除非您添加的更新也适用于ViewBag,否则我认为您的答案可能会引起误解,除非您有资格你特指'ConcurrentBag ' – smartcaveman 2011-03-21 12:37:39

0

从MSDN文档的第一行:

表示对象的线程安全的,无序的集合。

我不认为这比“List”或“ReadOnlyCollection”更直观,实际上是 - YMMV。

+0

我想这是一个意见问题,但你真的不认为它更容易可视化列表是什么,你可以用列表做什么,而不是一袋什么和你可以用一个包做什么?我认为列表的概念在其语义定义上比袋子更有限。我的意思是,检查http://dictionary.reference.com/browse/list和http://dictionary.reference.com/browse/bag中定义的差异。看起来你需要更少的技术背景来理解'List'而不是'Bag' ......但是,它仍然只是意见 – smartcaveman 2011-03-21 12:32:18

+0

@smartcaveman:这绝对是一个意见和背景问题。但在数据结构上下文中,“bag”与“list”相比是一个更精确的术语。人们使用“list”来引用许多不同的(但相似的)数据结构(一个数组?一个链表?一个FP列表?),但是当你提到一个“包”时,你所谈论的数据结构是毫无疑问的(除非另一个人从来没有听说过它)。 – 2011-03-21 12:40:05

+0

@Martinho,同意。为了避免混淆,我尽量保持编程隐喻尽可能接近“真实世界”环境。这就是我直观的意思。但是,在你接近它的背景下,我完全看到你和丹从哪里来。 – smartcaveman 2011-03-21 12:50:32

相关问题