首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有IDictionary的LRU实现?

有没有IDictionary的LRU实现?
EN

Stack Overflow用户
提问于 2009-04-15 23:55:56
回答 11查看 31.4K关注 0票数 31

我想实现一个简单的内存中LRU缓存系统,我正在考虑一种基于IDictionary实现的解决方案,它可以处理哈希LRU机制。我来自java,我有过使用LinkedHashMap的经验,它可以很好地满足我的需求:我在任何地方都找不到针对.NET的类似解决方案。

有没有人开发过它,或者有人有过这样的经历?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-04-16 00:07:36

基类库中没有这样做的东西。

在免费的方面,也许像C5的HashedLinkedList这样的东西可以工作。

如果你愿意付费,也许可以看看this C# toolkit.,它包含了一个实现。

票数 9
EN

Stack Overflow用户

发布于 2010-09-15 23:44:44

这是我们为我们自己的网站开发的一个非常简单快速的实现。

我们试图尽可能地改进代码,同时保持它的线程安全。我认为代码非常简单明了,但是如果你需要一些解释或者关于如何使用它的指南,请不要犹豫。

代码语言:javascript
运行
复制
namespace LRUCache
{
    public class LRUCache<K,V>
    {
        private int capacity;
        private Dictionary<K, LinkedListNode<LRUCacheItem<K, V>>> cacheMap = new Dictionary<K, LinkedListNode<LRUCacheItem<K, V>>>();
        private LinkedList<LRUCacheItem<K, V>> lruList = new LinkedList<LRUCacheItem<K, V>>();

        public LRUCache(int capacity)
        {
            this.capacity = capacity;
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        public V get(K key)
        {
            LinkedListNode<LRUCacheItem<K, V>> node;
            if (cacheMap.TryGetValue(key, out node))
            {
                V value = node.Value.value;
                lruList.Remove(node);
                lruList.AddLast(node);
                return value;
            }
            return default(V);
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        public void add(K key, V val)
        {
            if (cacheMap.TryGetValue(key, out var existingNode))
            {
                lruList.Remove(existingNode);
            }
            else if (cacheMap.Count >= capacity)
            {
                RemoveFirst();
            }

            LRUCacheItem<K, V> cacheItem = new LRUCacheItem<K, V>(key, val);
            LinkedListNode<LRUCacheItem<K, V>> node = new LinkedListNode<LRUCacheItem<K, V>>(cacheItem);
            lruList.AddLast(node);
            // cacheMap.Add(key, node); - here's bug if try to add already existing value
            cacheMap[key] = node;
        }

        private void RemoveFirst()
        {
            // Remove from LRUPriority
            LinkedListNode<LRUCacheItem<K,V>> node = lruList.First;
            lruList.RemoveFirst();

            // Remove from cache
            cacheMap.Remove(node.Value.key);
        }
    }

    class LRUCacheItem<K,V>
    {
        public LRUCacheItem(K k, V v)
        {
            key = k;
            value = v;
        }
        public K key;
        public V value;
    }
}
票数 55
EN

Stack Overflow用户

发布于 2011-06-04 00:01:23

在谷歌搜索的时候找到了你的答案,还发现了这个:

http://code.google.com/p/csharp-lru-cache/

csharp-lru-cache:LRU缓存集合类库

这是一个集合类,用作最近最少使用的缓存。它实现了ICollection<T>,但也公开了其他三个成员:

  • Capacity,缓存可以包含的最大项数。一旦集合达到容量,向缓存添加新项将导致最近最少使用的项被丢弃。如果在构造时将容量设置为0,则缓存不会自动丢弃collection.
  • DiscardingOldestItem,中最旧的(即最近最少使用的)项,这是当缓存将要丢弃其最旧的项时引发的事件。这是一个非常简单的实现。虽然它的Add和Remove方法是线程安全的,但它不应该在繁重的多线程环境中使用,因为在这些方法期间整个集合都会被锁定。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/754233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档