首页 > 解决方案 > 以更高的效率将嵌套数组中的值添加到唯一列表中

问题描述

我正在使用 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 缓存锁定这些资源,因此不会同时处理共享数据。但我想让这个锁定/解锁机制的逻辑尽可能高效,这就是其中的一部分。

标签: c#arraysperformance

解决方案


试图在列表中查找重复项会花费很多。从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 问题


推荐阅读