IDictionary Как получить значение удаленного элемента при удалении - PullRequest
0 голосов
/ 28 августа 2018

Хотелось бы узнать, возможно ли удалить элемент IDictionary по его ключу, а за это время получить его фактическое значение, которое было удалено?

Пример

что-то вроде:

Dictionary<string,string> myDic = new Dictionary<string,string>();
myDic["key1"] = "value1";

string removed;
if (nameValues.Remove("key1", out removed)) //No overload for this...
{
    Console.WriteLine($"We have just remove {removed}");
}

выход

//We have just remove value1

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вы можете написать метод расширения для этого:

public static class DictionaryExtensions
{
    public static bool TryRemove<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, out TValue value)
    {
        if (dict.TryGetValue(key, out value))
            return dict.Remove(key);
        else
            return false;
    }
}

Это попытается получить значение и, если оно существует, удалит его. В противном случае вы должны использовать ConcurrentDictionary, как сказал другой ответ.

0 голосов
/ 28 августа 2018

Обычные словари не имеют этой функциональности в качестве атомарной операции, но ConcurrentDictionary<TKey,TValue> делает .

ConcurrentDictionary<string,string> myDic = new ConcurrentDictionary<string,string>();
myDic["key1"] = "value1";

string removed;
if (myDic.TryRemove("key1", out removed))
{
    Console.WriteLine($"We have just remove {removed}");
}

Вы могли бы написать метод расширения для обычного словаря, чтобы реализовать это, но если вы обеспокоены тем, что он атомарный, ConcurrentDictionary, вероятно, более подходит для вашего варианта использования.

...