You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何优化对象交集场景下的属性设置性能?

优化集合交集属性设置的性能方案

嘿,我懂你现在的困扰——处理两个集合交集时性能拉胯,对吧?先猜一下,你大概率是用了嵌套循环(比如挨个遍历Products,再逐个比对Storages里的Id),这种方式的时间复杂度是O(n*m),10000*500=500万次操作,虽然不算天文数字,但确实有很大的优化空间。

核心优化思路:用HashSet把查找复杂度降到O(1)

我们可以先把Storages里所有Product的Id提取到一个HashSet<int>中,因为HashSet的成员查找是常数时间的。然后只需要遍历一次Products集合,直接检查当前Id是否在HashSet里即可,整体时间复杂度降到O(n+m),操作次数瞬间降到10500次,性能提升非常显著。

具体实现代码

// 第一步:提取Storages中所有非空Product的Id到HashSet
var storageProductIds = new HashSet<int>();
foreach (var storage in Storages)
{
    // 避免stProduct为null导致空引用异常
    if (storage.stProduct != null)
    {
        storageProductIds.Add(storage.stProduct.Id);
    }
}

// 第二步:遍历Products集合,设置isIntersected属性
foreach (var product in Products)
{
    product.isIntersected = storageProductIds.Contains(product.Id);
}

额外优化点(可选)

  • 如果Storages里的stProduct不可能为null,可以去掉null检查,进一步节省一点点时间
  • 如果你用的是.NET Core 3.0+,可以用LINQ的ToHashSet()简化第一步:
    var storageProductIds = Storages.Where(s => s.stProduct != null)
                                   .Select(s => s.stProduct.Id)
                                   .ToHashSet();
    
    不过LINQ的写法在性能上和手动foreach几乎没差别,主要是代码更简洁。

为什么这比嵌套循环快?

原来的嵌套循环每处理一个Product,都要遍历整个Storages集合找匹配的Id;而HashSet通过哈希表实现,查找操作平均只需要1次计算和比对,直接把内层循环的O(m)变成了O(1),整体效率提升了几十倍。

内容的提问来源于stack exchange,提问作者Dice 249

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:18:20