Мне нужен словарь (или любая другая коллекция), который всегда остается отсортированным по значению и может быть проиндексирован по ключу. Моя цель — реализовать кеш, в котором объекты имеют уникальный ключ и связанную с ними метрику. При необходимости замены кеша объекты с наименьшей метрикой удаляются. Это должно быть как можно быстрее, поэтому делать полный заказ каждый раз, когда производится замена, — не лучший вариант. Есть идеи? Спасибо
Словарь‹› всегда сортируется по значению, индекс поиска по ключу
Ответы (5)
Что-то вроде этого должно работать нормально (не очень тестировалось):
Похоже, приоритетная очередь — это то, что вы ищете. Существуют хорошие реализации этого класса с использованием двоичной кучи. Пример: http://www.codeproject.com/Articles/126751/Priority-queue-in-Csharp-with-help-of-heap-data-st.aspx
Вы можете комбинировать любую очередь с быстрым приоритетом (см. здесь: очередь с приоритетом в .Net) с стандартный словарь к новой коллекции. При вставке нового элемента вставьте ссылку на элемент в оба контейнера. При поиске элемента по «ключу» используйте словарь. Когда вы собираетесь удалить элемент с наименьшей «метрикой», используйте приоритетную очередь, чтобы найти его, получите ключ из самого элемента, тогда легко удалить ссылки на элементы из обоих контейнеров.
Почему бы вам просто не сохранить обычный словарь. Теперь, всякий раз, когда вам нужно выполнить эту замену кеша, вы выбираете элемент с «минимальным» значением и заменяете его.
Изменить - вот как вы получаете KeyPair с минимальным значением. Просто используйте свойства Key и Value после этого:
var minValuePair = myDictionary.OrderBy(p => p .Value).First();
myDictionary.Min(x => x.Value)
но это очень медленно. Хотелось бы, чтобы словарь всегда был отсортирован, то есть при вставке нового объекта в словарь он должен располагаться в правильном для своей метрики положении.
- person Ricardo; 17.08.2011
Вам нужен словарь, отсортированный по значению, но также имеющий индексацию по ключу. Вы не можете организовать свои данные двумя способами одновременно, поэтому вам нужно будет иметь две коллекции, ваш базовый словарь ключ-значение и словарь обратного просмотра. Ваш первый — стандартный словарь, второй — SortedDictionary
с теми же данными, а ключи и значения поменялись местами. Вам придется синхронизировать их.
Вы также можете написать свою собственную реализацию словаря, чтобы объединить эти две коллекции в одну.
KeyedCollection<TKey TItem>
? msdn.microsoft.com/en-us/library/ms132438.aspx является ключевой частью предмета? - person Russ Cam   schedule 17.08.2011