【问题标题】:Which collection type suits my needs the best?哪种收藏类型最适合我的需求?
【发布时间】:2012-09-13 13:42:58
【问题描述】:

我有一个简单的“缓存”基础架构,如下所示:

Dictionary<string, object> cache = new Dictionary<string, object>();

(我在这里使用object作为值类型,但实际上它是一种更具体的类型。)

这个想法是按名称在 tis 字典中存储许多计算值(实际上是来自 SQL 数据库的结果)。我需要快速插入和检索,主要是针对单个元素。

现在使用它,我发现有时需要通过删除所有以特定字符串开头的条目来使某些条目无效。我的幼稚实现是这样的:

cache.Keys.Where(key => key.StartsWith(name)).ToList().ForEach(cache.Remove);

知道这可能不是最好的解决方案,我在 .NET Framework 中四处寻找可以让我更有效地执行此操作的数据结构。

有没有比Dictionary&lt;&gt; 更合适的课程?

【问题讨论】:

  • 如果您使用的是 SQL Server,您是否签出了SqlCacheDependency? msdn.microsoft.com/en-us/library/…
  • 您希望缓存中有多少项目?
  • @paul 数据本身最终来自SQL Server,但是我们的失效比这更复杂。
  • @Erno 我们预计缓存中有几千个项目,但更新和查找非常频繁。我会说 80% 的查找、10% 的更新和 10% 的失效。但这些都是粗略的数字,并且高度依赖于使用情况。
  • 您确定需要缓存吗?根据设置,简单地查询数据库可能会更快。

标签: .net caching


【解决方案1】:

如果您需要查找与字符串开头相对应的元素,请考虑使用Trie。它实际上是一个图(树),每个顶点都有一个字母。代码从包含字符串第一个字母的一个根开始遍历图形,移动到具有相应第二个节点的链接节点,依此类推。

基类库中没有提供实现。有关示例实现,请参阅 http://geekyisawesome.blogspot.com.au/2010/07/c-trie.html。

【讨论】:

  • 我们在应用程序的不同部分使用 Trie,所以我应该准备好实现。我去看看,谢谢!
【解决方案2】:

正如阿克顿所说,trie 可能是一个不错的选择。如果您想坚持使用框架类,您有以下选择:

  • 字典:O(1) 插入,O(1) 检索,O(n) 删除以 X 开头的元素
  • SortedList:O(log(n)) 插入,O(log(n)) 检索,O(n) 删除以 X 开头的元素(假设删除元素的数量与总元素的数量相比很小)。

【讨论】:

  • SortedList&lt;&gt; 的文档指出删除是一个 O(n) 操作。此外,它在内部组织为一个数组,因此删除一个元素应该比使用二叉树更昂贵,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2016-02-28
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多