我为什么要把物品放在包里?

时间:2011-03-21 12:21:42

标签: .net collections .net-4.0 bag viewbag

我刚看到一个关于System.Collections.ConcurrentBag<T>类的SO问题,我在ASP.NET MVC中看到了ViewBag的{​​{1}}属性。根据我的经验,我已经了解到如果你理解他们在撰写文章时到底得到了什么,那么使用人们的代码会更容易。我认为ControllerList<T>Dictionary<TKey,TValue>的含义非常直观。另一方面,ReadOnlyCollection<T>不是那么直观。

所以,我的问题是:这个Bag隐喻的含义是什么,特别是关于.NET框架?

3 个答案:

答案 0 :(得分:6)

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

与其他一些系列相比:

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

可能的用途包括您不关心排序的工作队列(否则您将使用ConcurrentQueue / ConcurrentStack)或您将始终应用排序的项目列表将数据提取到另一个“本地”集合后进行排序。

答案 1 :(得分:0)

从MSDN文档的第一行:

  

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

我认为这不比“List”或“ReadOnlyCollection”更直观,真的是 - YMMV。

答案 2 :(得分:0)

ConcurrentBag与ConcurrentStack和ConcurrentQueue相同,只是由于性能原因不能保持排序,本文将更详细地解释它http://www.emadomara.com/2011/08/what-is-concurrentbag.html