【发布时间】:2016-09-15 16:55:12
【问题描述】:
我的情况是我想要一个像这样在ConcurrentDictionary 上的方法。
bool TryRemove(TKey key, TValue value) {
// remove the value IF the value passed in == dictionary[key]
// return false if the key is not in the dictionary, or the value is not equal
}
有没有办法同时做到这一点?我正在努力寻找这种情况的答案,尽管这似乎是一个常见的用例。
我可以做这样的事情,但如果我已经在使用ConcurrentDictionary,我想避免锁定。我还必须锁定 GetOrAdd() 或 AddOrUpdate() 其他地方的电话。似乎应该有更好的方法使用ConcurrentDictionary。
ConcurrentDictionary<int, string> dict = ...;
/// stuff
int keyTryToRemove = 1337;
string valTryToRemove = "someValue";
bool success = false;
lock(keyTryToRemove) {
string val;
if (dict.TryRemove(keyTryToRemove, out val)) {
if (val == valTryToRemove) {
success = true;
}
else { // reinsert value, UGLY!
dict[keyTryToRemove] = val;
success = false;
}
} else {
success = false;
}
}
【问题讨论】:
-
如果
TryGetValue和Remove返回 true 并且值匹配,该怎么办?不过你仍然需要锁。 -
@Igor 根据键删除并返回值,如果键和值都匹配,OP希望删除条目。他们甚至在那里尝试使用它。
-
@Igor 这正是我不想要的。我想有条件地删除该值,前提是它与我传递给它的值匹配。
-
@juharr - 啊,我错过了。
标签: c# concurrency concurrentdictionary