如何从嵌套的ConcurrentDictionary中删除项目?

时间:2019-02-12 02:29:38

标签: c# concurrentdictionary

我要做的是将在线聊天的成员保留在内存中。我已经定义了一个静态嵌套字典,如下所示:

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然后删除它不是原子的。

谢谢。

1 个答案:

答案 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;