c# - 与 C++ std::map::insert 行为相比,C# SortedDictionary 效率
问题描述
是否有与 C++ 等效std::map::insert
的 C# SortedDictionary
(或类似容器),但它也指示插入成功或失败,并且如果插入失败,它还提供对现有键值对的访问?
本质上:我想尝试添加一个新的键值对,或者如果一个匹配的键已经存在,获取它的关联值并对它做一些事情,而不会产生潜在的(主观的)高昂的 2 次遍历成本容器,这在 C++ 中很简单?
据我所知,我可以尝试添加一个新的键值对(它必须对容器进行一定量的遍历)。如果它失败了,我必须捕获一个表明密钥已经存在的异常,然后我必须找到现有的 kv 对(可能是容器的另一个遍历)来获取我现在可以修改的关联值。或者,我可以首先搜索密钥是否存在(一次遍历)。如果没有,那么我想添加一个新的 kv 对(这很可能涉及很多相同的遍历工作)。无论哪种方式,最坏的情况是 2 次潜在的昂贵遍历,而 C++ 的 std::map::insert 提供了一种有效的机制来实现我想要的,只使用 1 次遍历。
解决方案
为了其他人的利益,缺乏答案让我得出结论,没有相当于好的“尝试将新的键值插入地图,但如果键已经在那里,告诉我并给我现有的键和值”操作,例如标准 Dictionary 或 C# 中的 SortedDictionary 的std::map::insert 。这似乎是这些容器设计中的疏忽。
但是,在上面的评论中感谢@DragandDrop 的答案,即存在 ConcurrentDictionary 的“AddOrUpdate”或“GetOrAdd”,这将允许在一次遍历中请求的行为(尽管显然有额外的锁定机制开销,这取决于使用,可能超过常规 Dictionary/SortedDictionary 容器的双重遍历)。
推荐阅读
- html - Html Css溢出到页面右侧
- node.js - 有没有办法掏出一个不同的程序并让它接管?
- java - SPARK SQL java.lang.OutOfMemoryError:超出 GC 开销限制
- variables - SSIS - 在 ado.net 源 SQL 命令表达式的 where 子句中将变量作为列名传递
- java - Spring Boot 应用程序中的角色在使用数据库身份验证时不起作用,但在使用内存时起作用
- timezone - 时区缩写
- pyspark - 通过将带有 fillna 的两列与 pyspark 中的现有列值连接起来创建新列
- javascript - 访问相邻 JS 文件中的函数时遇到问题
- python - PLOTLY 导入 Mapbox 图层“.mbtiles”格式
- dart - Dart 中的不同流