c# - 以更高的效率将嵌套数组中的值添加到唯一列表中
问题描述
我正在使用 C#,我得到了一个带有嵌套数组的文档-这是其数据结构的简化示例(作为 json)-
{
"property1": "...",
"property2": "...",
"lines": [
"lineProp1": "..",
"lineProp2": "..",
"nestedItems": [
{
"nestedValue": "12345"
},
{
"nestedValue": "1111"
}
]
]
}
我需要在此文档上运行,对于每一行,在其嵌套项目上运行,对于每个嵌套项目,将其添加nestedValue
到一个新列表中,并且只对唯一值(无重复)这样做。
最简单的方法是执行以下操作:
foreach(line in lines)
foreach(nestedItem in line.nestedItems)
check if nestedItem.nestedValue exists already exists in my new list,
if not add it.
我想知道是否有更有效的方法来做到这一点。通过这个逻辑,我可能会有相当大的流量。
一些上下文:我正在尝试提取一组文档 ID,然后我将通过 redis 缓存锁定这些资源,因此不会同时处理共享数据。但我想让这个锁定/解锁机制的逻辑尽可能高效,这就是其中的一部分。
解决方案
试图在列表中查找重复项会花费很多。从HashSet进行此类检查更容易和更快(我将研究和更新检索时间 - 找不到硬值,但理论上它应该是基于 Hash 的数据结构的 O(1) 和 O(N)对于列表)。
警告:HashSet 不能被订购,也不允许任何重复。
所以你可以保留代码并执行以下操作
foreach(line in lines)
foreach(nestedItem in line.nestedItems)
// Just add to the HashSet. If it exists it will not add it at all
返回:布尔值
如果元素被添加到 HashSet 对象,则为 true;
如果元素已经存在,则返回 false。
从文档中引用。
HashSet 类基于数学集合模型,提供类似于访问 Dictionary 或 Hashtable 集合的键的高性能集合操作。简单来说,可以将 HashSet 类视为没有值的 Dictionary 集合。
HashSet 集合未排序且不能包含重复元素。如果顺序或元素重复对应用程序而言比性能更重要,请考虑将 List 类与 Sort 方法一起使用。
要转换为列表,只需检查这个 SO 问题
推荐阅读
- python - 即使我确定它已安装,python 3 也无法识别我的库
- ruby-on-rails - 在 Controller 中删除服务器端 cookie 的问题
- java - 在 springboot 中使用 @EnableWebFluxSecurity 时出错
- python-3.x - Python避免嵌套for循环
- model - Anylogic:如何生产各种产品?
- c++ - 调用 'std::vector::push_back(std::string&)' 没有匹配的函数
- javascript - 如何保存报表过滤器并使其可用于执行和调度
- elasticsearch - 仅当 elasticsearch 区分大小写时才获得结果
- javascript - Javascript DOM 制作表格
- javascript - 如何使用数组方法对数组中对象的属性求和