我可以使用单独的SortedList而不是SortedDictionary来保持{key和timestamp}在时间戳上排序,但是我将不得不进行“线性”查找以从列表中查找键(当我必须更新时)时间戳,当再次访问相同的密钥时) – 如果可能的话,我正在寻找比线性更好的方法.有人可以分享想法来处理这个问题吗?
所以,我的问题归结为:
我要在< = logn time中查找键以更新时间戳,同时能够获得基于时间戳排序的键. 一种方法是保持SortedDictionary为< {key,timestamp},null>它根据{key,timestamp}的时间戳部分对键进行排序.虽然这很好,但问题是hashcode()只需要返回key.hashcode()(用于在更新时间戳时查找),而equals()也应该使用时间戳.所以,equals()和hashcode()是冲突的,所以觉得这不是一个好主意……
解决方法 你应该做的是保留两个词典,一个按时间排序,一个按键排序.请记住,字典只保存对实际对象的引用,因此用于更新对象的字典无关紧要.
要更新对象,请创建一个将更新这两个词典的函数
var oldobj = keyedobject[key];timedobjects.Remove(oldobj.LastUpdateTime);timedobjects.Add(myUpdatedobject.LastUpdateTime,myUpdatedobject);keyedobject[key] = myUpdatedobject;
现在,您可以通过时间和关键字跟踪同一个对象.
我只对timedobjects中的对象保留一个引用.这有助于删除.
您可以根据需要继续修剪timedobjects字典.
Ofcource,虽然修剪你必须记住,有另一个字典keyedobject引用同一个对象.仅仅呼叫删除是不够的.
您的删除代码必须是这样的:
removeObject = timedobjects[timetoRemove];timedobjects.Remove(timetoRemove);keyedobject.Remove(removeObject.key);
timetoRemove主要来自for循环,您可以在其中决定要删除的对象
总结以上是内存溢出为你收集整理的排序字典按C#(LRU缓存)中的值排序全部内容,希望文章能够帮你解决排序字典按C#(LRU缓存)中的值排序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)