/// <summary> /// Removes the block. /// </summary> /// <param name="block">The block.</param> public void RemoveBlock(CacheBlock <TKey, TValue> block) { lock (Blocks) { Blocks.Remove(block.Key); } }
/// <summary> /// Adds the specified key. /// </summary> /// <param name="key">The key.</param> /// <param name="value">The value.</param> /// <returns></returns> public CacheBlock <TKey, TValue> Add(TKey key, TValue value) { lock (this.Blocks) { if (this.Blocks.Count >= this.BlockSetCapacity) { this.RemoveFirst(); } if (this.Blocks.ContainsKey(key)) { var r = this.Blocks[key]; this.lruList.Remove(r); //this.lruList.AddLast(r); this.Blocks.Remove(key); } CacheBlock <TKey, TValue> cacheItem = new CacheBlock <TKey, TValue>(key, value); LinkedListNode <CacheBlock <TKey, TValue> > node = new LinkedListNode <CacheBlock <TKey, TValue> >(cacheItem); this.lruList.AddLast(node); this.Blocks.Add(key, cacheItem); return(cacheItem); } }
/// <summary> /// Returns the value and also a flag indicating if given key is present or not and a default value if not key not found /// </summary> /// <param name="key">The key.</param> /// <param name="value">The value.</param> /// <returns></returns> public bool TryGetValue(TKey key, out TValue value) { value = default(TValue); lock (this.BlockSetsLookup) { CacheBlockSet <TKey, TValue> node = null; CacheBlock <TKey, TValue> mblock = null; foreach (var set in BlockSetsLookup.Values) { foreach (var block in set.Blocks) { if (block.Key.Equals(key)) { node = set; mblock = block.Value; break; } } } if (mblock != null) { TValue blockvalue = default(TValue); if (node.TryGetValue(key, out blockvalue)) { node.TryGetValue(key, out blockvalue); value = blockvalue; var lrublock = this.lruList.Find(mblock); this.lruList.Remove(lrublock); this.lruList.AddLast(lrublock); return(true); } } value = default(TValue); return(false); } }
/// <summary> /// Adds the block set to cache. /// </summary> /// <param name="key">The key.</param> /// <param name="value">The value.</param> /// <param name="blockSet">The block set.</param> private void AddBlockSetToCache(TKey key, TValue value, CacheBlockSet <TKey, TValue> blockSet) { CacheBlock <TKey, TValue> cacheItem = null; if (blockSet != null) { cacheItem = blockSet.Add(key, value); } var blocksets = BlockSetsLookup.Values; if (!blocksets.Any(a => a.Blocks.Any(b => b.Key.Equals(key)))) { BlockSetsLookup.Add(key, blockSet); } this.lruList.AddLast(cacheItem); }