猿问

如何从嵌套的并发词典中删除项目?

我试图做的是让群聊的在线成员留在记忆中。我定义了一个静态嵌套字典,如下所示:


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

谢谢。


慕田峪4524236
浏览 87回答 1
1回答

慕哥6287543

要从组中删除 a,您需要获取该组的...ChatMemberConcurrentDictionary<>var&nbsp;groupDictionary&nbsp;=&nbsp;onlineGroupsMembers["groupID"];...或。。。var&nbsp;groupDictionary&nbsp;=&nbsp;onlineGroupsMembers.TryGetValue("groupID",&nbsp;out&nbsp;ConcurrentDictionary<string,&nbsp;ChatMember>&nbsp;group);然后,您将尝试删除该成员...groupDictionaryvar&nbsp;wasMemberRemoved&nbsp;=&nbsp;groupDictionary.TryRemove("memberID",&nbsp;out&nbsp;ChatMember&nbsp;removedMember);要从中完全删除组,请直接在该字典上调用...onlineGroupsMembersTryRemove&nbsp;var&nbsp;wasGroupRemoved&nbsp;=&nbsp;onlineGroupsMembers.TryRemove("groupID",&nbsp;out&nbsp;ConcurrentDictionary<string,&nbsp;ChatMember>&nbsp;removedGroup);实现此目的的一种不那么麻烦的方法可能是使用两个未嵌套的字典。人们会从组ID映射到类似ConcurrentBag<>或并发HashSet<>(如果存在)的东西。ChatMemberConcurrentDictionary<string,&nbsp;ConcurrentBag<ChatMember>>&nbsp;groupIdToMembers;...或从组 ID 到其成员 ID...ConcurrentDictionary<string,&nbsp;ConcurrentBag<string>>&nbsp;groupIdToMemberIds;请注意,允许重复值。ConcurrentBag<>在后一种情况下,如果您想要一种快速获取给定成员ID的方法,则可以使用另一个字典来获取...ChatMemberConcurrentDictionary<string,&nbsp;ChatMember>&nbsp;memberIdToMember;
随时随地看视频慕课网APP
我要回答