我要做的是将在线聊天的成员保留在内存中。我已经定义了一个静态嵌套字典,如下所示:
private static ConcurrentDictionary<string, ConcurrentDictionary<string, ChatMember>> onlineGroupsMembers = new ConcurrentDictionary<string, ConcurrentDictionary<string, ChatMember>>();
然后,当新成员到达时,我添加它:
onlineGroupsMembers.AddOrUpdate
(chatKey,
(k) => // add new
{
var dic = new ConcurrentDictionary<string, ChatMember>();
dic[chatMember.Id] = chatMember;
return dic;
},
(k, value) => // update
{
value[chatMember.Id] = chatMember;
return value;
});
现在的问题是如何从内部词典中删除成员?以及如何在外字典为空时从外字典删除它?
并发字典具有TryRemove,但它无济于事,检查ContainsKey然后删除它不是原子的。
谢谢。
答案 0 :(得分:1)
要从一个网上论坛中删除ChatMember
,您需要使用...获取该网上论坛的ConcurrentDictionary<>
。
var groupDictionary = onlineGroupsMembers["groupID"];
...或...
var groupDictionary = onlineGroupsMembers.TryGetValue("groupID", out ConcurrentDictionary<string, ChatMember> group);
然后从groupDictionary
中删除成员...
var wasMemberRemoved = groupDictionary.TryRemove("memberID", out ChatMember removedMember);
要从onlineGroupsMembers
中完全删除一个组,您可以直接在该词典上调用TryRemove
...
var wasGroupRemoved = onlineGroupsMembers.TryRemove("groupID", out ConcurrentDictionary<string, ChatMember> removedGroup);
使用两个不嵌套的字典可以不太麻烦地实现此目的。一个人可能会从一个组ID映射到ChatMember
的{{3}}或并发HashSet<>
(如果存在)之类的东西……
ConcurrentDictionary<string, ConcurrentBag<ChatMember>> groupIdToMembers;
...或从组ID到其成员ID ...
ConcurrentDictionary<string, ConcurrentBag<string>> groupIdToMemberIds;
请注意,ConcurrentBag<>
允许重复的值。
在后一种情况下,如果您想快速获取给定成员ID的ChatMember
,则可以使用另一本字典...
ConcurrentDictionary<string, ChatMember> memberIdToMember;