社区首页 >问答首页 >如何从嵌套的ConcurrentDictionary中删除项?

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

Stack Overflow用户
提问于 2019-02-11 18:29:38
回答 1查看 277关注 0票数 0

我想要做的是让网络上的小组聊天成员保持记忆。我定义了这样一个静态嵌套字典:

代码语言:javascript
代码运行次数:0
复制
private static ConcurrentDictionary<string, ConcurrentDictionary<string, ChatMember>> onlineGroupsMembers = new ConcurrentDictionary<string, ConcurrentDictionary<string, ChatMember>>();

然后,当一个新成员到达时,我会添加它:

代码语言:javascript
代码运行次数:0
复制
        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,因此删除它不是原子的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-11 19:04:05

若要从组中删除ChatMember,您需要为该组获取ConcurrentDictionary<>

代码语言:javascript
代码运行次数:0
复制
var groupDictionary = onlineGroupsMembers["groupID"];

...or...

代码语言:javascript
代码运行次数:0
复制
var groupDictionary = onlineGroupsMembers.TryGetValue("groupID", out ConcurrentDictionary<string, ChatMember> group);

然后在groupDictionary中尝试删除该成员..。

代码语言:javascript
代码运行次数:0
复制
var wasMemberRemoved = groupDictionary.TryRemove("memberID", out ChatMember removedMember);

要从onlineGroupsMembers中完全删除一个组,您可以在该字典上直接调用TryRemove .

代码语言:javascript
代码运行次数:0
复制
 var wasGroupRemoved = onlineGroupsMembers.TryRemove("groupID", out ConcurrentDictionary<string, ChatMember> removedGroup);

实现这一点的一个不那么麻烦的方法可能是使用两个不嵌套的字典。您可以从组ID映射到类似于ConcurrentBag<>或并发HashSet<> (如果存在的话)的ChatMember.

代码语言:javascript
代码运行次数:0
复制
ConcurrentDictionary<string, ConcurrentBag<ChatMember>> groupIdToMembers;

从组ID到其成员ID的...or .

代码语言:javascript
代码运行次数:0
复制
ConcurrentDictionary<string, ConcurrentBag<string>> groupIdToMemberIds;

注意,ConcurrentBag<>允许重复的值。

在后一种情况下,如果您想要一种快速获取给定成员ID的ChatMember的方法,您可以使用另一个字典.

代码语言:javascript
代码运行次数:0
复制
ConcurrentDictionary<string, ChatMember> memberIdToMember;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54641998

复制
相关文章
[LEETCODE]从排序数组中删除重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
用户2353021
2020/05/11
6.3K0
Swift 从排序数组中删除重复项 - LeetCode
给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。
韦弦zhy
2018/09/11
5.2K0
[Leetcode][python]删除排序数组中的重复项/删除排序数组中的重复项 II
数组完成排序后,我们可以放置两个指针 ii 和 jj,其中 ii 是慢指针,而 jj 是快指针。只要 nums[i] = nums[j]nums[i]=nums[j],我们就增加 jj 以跳过重复项。
蛮三刀酱
2019/03/26
6.5K0
如何从JavaScript对象中删除属性?
在使用 JavaScript 中的对象时,你可能会遇到需要从对象中完全删除属性的情况。为实现这一点可以有好几个选择:
疯狂的技术宅
2021/04/01
12.3K0
如何从组中删除Linux用户?
在Linux中,用户可以是一个主要组和一个或几个次要(辅助)组的成员。文件“ / etc / group”为Linux系统中的每个用户定义了组成员身份。
用户6543014
2020/04/07
19.6K0
Flutter:如何修复/删除 .pub-cache 中的所有依赖项
如果您正在使用 Flutter 开发应用程序并遇到与系统缓存(在**./pub-cache**文件夹中)中的一个或多个软件包有关的问题,您可以通过执行以下命令重新安装所有缓存的依赖项:
徐建国
2022/06/24
8.4K0
Flutter:如何修复/删除 .pub-cache 中的所有依赖项
删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
木瓜煲鸡脚
2020/09/23
5K0
<leetcode刷题-数组>删除排序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
哆哆jarvis
2022/08/23
4.3K0
删除有序数组中的重复项
要求删除重复元素,实际上就是将不重复的元素移到数组的左侧,即慢指针p的右边都是不重复的元素,p—q之间是出现重复的元素。
大忽悠爱学习
2021/03/27
4.7K0
删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
_kyle
2020/11/03
4.5K0
删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
狼啸风云
2023/10/07
1870
如何删除启动项中 program 空白程序启动项,最简教程;
参考文献:https://www.xtremerain.com/remove-unknown-program-startup/
西湖醋鱼
2020/12/30
5.7K0
如何删除启动项中 program 空白程序启动项,最简教程;
如何从Ubuntu Linux中删除Firefox Snap?
Ubuntu Linux是一款广受欢迎的开源操作系统,拥有强大的功能和广泛的应用程序选择。默认情况下,Ubuntu提供了一种称为Snap的软件打包格式,用于安装和管理应用程序。Firefox是一款流行的开源网络浏览器,而Firefox Snap是Firefox的Snap版本。
网络技术联盟站
2023/05/25
5.1K0
如何从Ubuntu Linux中删除Firefox Snap?
leetcode: explore-array-21 从排序数组中删除重复项
1、输入:是一个列表,同时是一个 sorted array nums,即排好序的列表,并且列表中只包含数字 2、输出:一个整数,这个整数是将列表中元素进行去重后的实际个数 3、in-place,这个单词经常在数组类的题目中出现,即原地修改数组,Do not allocate extra space for another array,两者意思是等价的 3、注意看 Clarification 这段话,它说明了题目的另一个要求,和 in-place 是一致的,即题目虽然输出是一个数字,但会去检查函数传入的那个列表,要求它的前 n 项必须依次是不重复的数字。
用户7685359
2020/08/24
2K0
leetcode: explore-array-21 从排序数组中删除重复项
如何从 Python 列表中删除所有出现的元素?
在 Python 中,列表是一种非常常见且强大的数据类型。但有时候,我们需要从一个列表中删除特定元素,尤其是当这个元素出现多次时。本文将介绍如何使用简单而又有效的方法,从 Python 列表中删除所有出现的元素。
网络技术联盟站
2023/06/01
12.3K0
dotnet 警惕 ConcurrentDictionary 使用 FirstOrDefault 获取到非预期的首项
在 dotnet 里面的 ConcurrentDictionary 是一个支持并发读写的线程安全字典,在这个字典里面有一些行为会出现随机性,即多次执行相同的代码返回的结果可能不相同。本文记录在 ConcurrentDictionary 使用 FirstOrDefault 获取到非预期的首项的问题
林德熙
2023/06/18
2450
删除有序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
狼啸风云
2023/10/07
1750
LeetCode | 删除有序数组中的重复项
题目 删除有序数组中的重复项 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。 不要使用额外的空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。 判题标准: 系统会用下面的代码来测试你的题解:
yiyun
2023/03/08
3.9K0
LeetCode | 删除有序数组中的重复项
[leetcode数组系列]3 删除排序数组中的重复项
1 leetcode原文链接 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 示例1
我是程序员小贱
2020/06/05
4.2K0
从嵌套结构中取值时如何编写兜底逻辑
对a解构时赋予的默认值(空数组),仅当b.a的值为undefined时才会生效,如果b.a的值为null,默认值就无法生效,使得第二行调用map方法的代码直接报错,所以第一行代码兜底并没有做好。
大史不说话
2020/11/03
2.9K0

相似问题

从ConcurrentDictionary中删除项

22

基于条件键从ConcurrentDictionary中删除多个项

43

如何在最终完成ConcurrentDictionary后从ContinueWith中删除项

14

从ConcurrentDictionary中删除多个元素

11

嵌套的ConcurrentDictionary

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档