【问题标题】:Complication in adding and removing object to a large collection in c#在 c# 中向大型集合添加和删除对象的复杂性
【发布时间】:2014-04-17 04:05:12
【问题描述】:

几天前,我遇到了一个问题,我有一个包含历史数据或大量对象的集合。这个集合暴露给这么多线程或客户端,所以,人们可能正在迭代它,有些人可能会添加到它,有些人可能会在迭代时删除到这个集合。因此,修改可能会在 c# 中引发“集合更改异常”。

现在,我需要在 c# 中设计一个数据结构或一个集合 它满足了以下挑战:

  1. 您不能将集合复制到不同的对象,因为集合非常大, 所以复制它会导致我们大量的内存浪费。

  2. 当任何用户在迭代集合时添加到集合中时,新对象应该被添加到集合中并且不应该引发任何异常,并且还应该在迭代结束时被读取。

  3. 但如果用户从集合中删除任何项目,那么它应该抛出异常。

  4. 添加、删除和迭代应该是线程安全的。不应该存在竞争条件。

【问题讨论】:

  • 考虑使用数据库。
  • 数据库是从磁盘读取的,它不在内存中。它会减慢整个操作
  • 错误;数据库引擎将在可行的情况下将数据库保存在内存中。
  • 他们需要多少数据?
  • IEnumerator 有一个合同,它应该抛出一个异常是枚举期间更改的可枚举

标签: c# multithreading generics ienumerable ienumerator


【解决方案1】:

如果你真的坚持使用集合而不是数据库。常规的 .NET 列表都不是一个好的选择。在这种情况下,您可以创建针对您的情况进行优化的自己的列表类型。

这取决于其他细节(您可以使用分页,您是否需要通过索引访问项目等)您可以使用什么技术。

一个想法可能是您创建一个可变列表,并且仅当它发生更改时,您才创建一个不可变副本。所有客户端都使用最后一个不可变副本。

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2012-01-12
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多