Есть ли реализация для удаления по ключу и получения значения одновременно?

Я делаю программу, критичную к производительности (небольшие академические вещи), и я стараюсь оптимизировать везде, где это возможно (не так, как это доказано), это "узкое место".

У меня есть пользовательская структура словаря (обертка вокруг.NET Dictionary<,>) и я бы постоянно убирал предметы на одной стадии (Key значение). мне нужно Value из удаленных предметов. Прямо сейчас я должен сделать:

T t;
if !TryGet(key, out t)
   return false;

Remove(key);

Это два поиска. Я хотел бы это:

public bool Remove(S key, out T value)
{
    // implementation
}

Я знаю, что в фреймворке ничего нет, но есть ли где-нибудь реализация? Если так, я бы изменил свой словарь поддержки на этот.

Редактировать: Хм, я знаю оба TryGetValue а также Remove О (1). Просто зная, есть ли какая-либо структура коллекции, которая дала бы такой же эффект только в одном поиске. Как я уже сказал, я стараюсь максимально оптимизировать. Просто зная.

3 ответа

Решение

Библиотека Универсального Копенгагенского Университета имеет Dictionary.Remove() метод, который, кажется, делает то, что вы хотите:

bool Remove (K k, out V v)

Возвращает true, если словарь содержит запись, ключ которой равен k, и если это так, удаляет эту запись и присваивает ассоциированное значение v; в противном случае возвращает false и присваивает значение по умолчанию для T для v.

Я сам не использовал эту библиотеку, но видел, что она рекомендована несколько раз здесь, на переполнении стека. Это бесплатно для коммерческого использования, при условии соблюдения этой лицензии в стиле MIT.

ConcurrentDictionary имеет TryRemove метод, который делает это. Это работает так же, как TryGet но это также удаляет элемент.

Dictionary<TKey, TValue>.TryGetValue а также Dictionary<TKey, TValue>.Remove оба метода являются операциями O(1), поэтому я не думаю, что вы должны беспокоиться о производительности здесь.

Другие вопросы по тегам