IDictionary How to get the removed item value while removing

IDictionary How to get the removed item value while removing



I would like to know if it is possible to remove an IDictionary item by its key and in the same time get its actual value that has been removed?


IDictionary



something like:


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





No, there isn't. What happens when the key does not exist?
– Ron Beyer
Aug 28 at 17:03





@RonBeyer Remove returns false when the key does not exist.
– Jonathon Chase
Aug 28 at 17:05





@JonathonChase I know that, but what does the out removed then contain? null? default(T)?
– Ron Beyer
Aug 28 at 17:06


out removed


null


default(T)





@RonBeyer I've updated my question, my current design is ok with null.
– Shahar Shukrani
Aug 28 at 17:06



null





@RonBeyer I'd expect default(T) as with the TryXYZ pattern, but you're right it needs to be defined.
– Jonathon Chase
Aug 28 at 17:07


default(T)




2 Answers
2



Normal dictionaries don't have this functionality as an atomic operation but a ConcurrentDictionary<TKey,TValue> does.


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");



You could write an extension method for a normal dictionary to implement this but if you are concerned about it being atomic a ConcurrentDictionary is probably more correct for your use case.



You could write an extension method for this:


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;




This will attempt to get the value and if it exists, will remove it. Otherwise you should use a ConcurrentDictionary as the other answer said.


ConcurrentDictionary





value = default(TValue);
– Rufus L
Aug 28 at 17:17


value = default(TValue);





This is definitely a personal preference but it might be a little easier to follow if the default assignment happened before the return false since that is the only time it is ever used.
– Marie
Aug 28 at 17:19





@RufusL 7.3 can infer it, it's not needed in this case.
– Ron Beyer
Aug 28 at 17:27






@RufusL I was actually going to ask about that too. I am surprised i missed that feature, thank you for the heads up!
– Marie
Aug 28 at 17:33





Cool, so the whole thing could be reduced to return dict.TryGetValue(key, out value) && dict.Remove(key);
– Rufus L
Aug 28 at 18:04



return dict.TryGetValue(key, out value) && dict.Remove(key);






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)