Есть ли реализация для удаления по ключу и получения значения одновременно?
Я делаю программу, критичную к производительности (небольшие академические вещи), и я стараюсь оптимизировать везде, где это возможно (не так, как это доказано), это "узкое место".
У меня есть пользовательская структура словаря (обертка вокруг.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), поэтому я не думаю, что вы должны беспокоиться о производительности здесь.