我需要一个字典(或其他集合),它可以始终按值排序,并且可以通过键进行索引。我的目的是实现一个缓存,其中对象具有唯一的键和与之关联的度量标准。当需要进行缓存替换时,将删除度量最小的对象。为了尽可能快速,因此每次进行替换时进行完整排序并不是一个好选择。有任何想法吗?谢谢
我需要一个字典(或其他集合),它可以始终按值排序,并且可以通过键进行索引。我的目的是实现一个缓存,其中对象具有唯一的键和与之关联的度量标准。当需要进行缓存替换时,将删除度量最小的对象。为了尽可能快速,因此每次进行替换时进行完整排序并不是一个好选择。有任何想法吗?谢谢
为什么不直接使用普通的字典呢?每当需要进行缓存替换时,只需选择具有“最小”值的元素并将其替换即可。
编辑 - 这是如何获取具有最小值的KeyPair。只需在此之后使用Key和Value属性:
var minValuePair = myDictionary.OrderBy(p => p .Value).First();
myDictionary.Min(x => x.Value)
,但速度非常慢。我希望字典总是能够排序,也就是说,当一个新对象被插入到字典中时,它应该根据其指标放置在正确的位置上。 - Ricardo看起来优先队列是你正在寻找的。使用二叉堆有很好的这个类的实现。例如:http://www.codeproject.com/Articles/126751/Priority-queue-in-Csharp-with-help-of-heap-data-st.aspx
您可以将任何类型的快速优先队列与标准字典组合成一个新集合(请参见:.Net中的优先队列)。插入新元素时,将元素的引用插入两个容器。当按“键”查找元素时,请使用字典。当要删除具有最低“度量”的元素时,请使用优先队列进行查找,从元素本身获取键,然后轻松地从两个容器中删除元素引用。
你想要一个按值排序并且可以通过键索引的字典。数据不能同时以两种方式排列,因此你需要有两个集合:基本的键值字典和一个反向查找字典。第一个是标准字典,第二个是具有相同数据但键和值交换的SortedDictionary
。你需要保持这两个字典同步。
你也可以编写自己的字典实现,将这两个集合封装成一个。
KeyedCollection<TKey TItem>
是否适合您的需求?http://msdn.microsoft.com/en-us/library/ms132438.aspx 是该项的关键部分吗? - Russ Cam