我正在尝试在 C# 中创建对象的“有序”缓存,其中顺序由访问次数决定。
我研究过 Dictionary、SortedList 和 SortedDictionary,它们非常接近,但不太有我想要的东西。
我想要一个包含所有以前缓存的项目的列表,这些项目可以有一个getHits()
方法来确定缓存项目应采用的顺序。
然后,我可以按名称访问该缓存并增加查看某个项目的次数。
简化示例(在伪C#):
class Result {
public int Hits = 0;
public string Name = "";
public void IncreaseHits() {
this.hits++;
}
public Result(String name) {
this.name = name;
}
}
class Program {
public MagicSortableType<string, Result> MyCache; //what structure to use?
public main() {
MyCache.Add(new Result("My result 1"));
MyCache.Add(new Result("My result 2"));
MyCache.Add(new Result("My result 3"));
MyCache['My result 2'].IncreaseHits();
MyCache['My result 2'].IncreaseHits();
MyCache['My result 3'].IncreaseHits();
MyCache.SortDesc(); //what is the real C# equivalent?
foreach(Result result in MyCache) {
Console.Write(result.Name + " - hits " + result.Hits);
}
}
}
Outputs:
My result 2 - hits 2
My result 3 - hits 1
My result 1 - hits 0
当我需要这样的东西时,我创建了一个所谓的MruDictionary
。它由一个LinkedList<T>
, and a Dictionary<string, LinkedListNode<T>>
(where T
是对象的类型,对象键是 typestring
).
访问是通过字典进行的。当一个项目被访问时,它被移动到列表的头部。添加项目后,它会添加到列表的头部。如果列表大小超出设置的最大值,则删除列表中的最后一个节点。
这非常有效。这些物品并不是按照使用次数排列的,而是严格按照 MRU 顺序排列的。这通常将最常用的项目保留在缓存中,但如果很长一段时间没有使用流行的项目,它就会被刷新。就我的目的而言,这非常有效。
我写了一篇关于它的文章。带有描述的完整源代码可在.
如果您确实需要的话,添加点击次数应该很容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)