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
@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.
No, there isn't. What happens when the key does not exist?
– Ron Beyer
Aug 28 at 17:03