求助:如何优化对象交集场景下的属性设置性能?
优化集合交集属性设置的性能方案
嘿,我懂你现在的困扰——处理两个集合交集时性能拉胯,对吧?先猜一下,你大概率是用了嵌套循环(比如挨个遍历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()简化第一步:
不过LINQ的写法在性能上和手动foreach几乎没差别,主要是代码更简洁。var storageProductIds = Storages.Where(s => s.stProduct != null) .Select(s => s.stProduct.Id) .ToHashSet();
为什么这比嵌套循环快?
原来的嵌套循环每处理一个Product,都要遍历整个Storages集合找匹配的Id;而HashSet通过哈希表实现,查找操作平均只需要1次计算和比对,直接把内层循环的O(m)变成了O(1),整体效率提升了几十倍。
内容的提问来源于stack exchange,提问作者Dice 249
相关产品推荐
相关产品推荐

