如何无需foreach比较含自定义类的列表GUID?优化现有对比逻辑
优化两个含GUID自定义类List的对比与合并逻辑
你的现有代码存在性能瓶颈:每次调用Any()都会遍历整个GameData_List.my_loading_list,数据量大时效率极低,时间复杂度是O(m*n)(m是myloadinglist长度,n是目标列表长度)。下面是无需显式foreach的实现方式,以及更高效的优化方案:
1. 去掉显式foreach的实现
可以结合LINQ和HashSet来简化逻辑,避免手写foreach循环:
List<MySecondGameList> myloadinglist = JsonConvert.DeserializeObject<List<MySecondGameList>>(json); // 提取已有GUID存入HashSet,O(n)时间完成 var existingGuids = new HashSet<Guid>(GameData_List.my_loading_list.Select(x => x.guid)); // 筛选出需要新增的元素 var newItems = myloadinglist.Where(item => !existingGuids.Contains(item.guid)).ToList(); // 批量添加到目标列表 GameData_List.my_loading_list.AddRange(newItems); // 如果需要保留日志输出,用ForEach替代foreach(语法层面无显式循环) myloadinglist.ForEach(item => { if (existingGuids.Contains(item.guid)) Debug.Log("Matching!!!!!!!!!!!!!!!!"); else Debug.Log("It is loading"); });
如果不需要逐个打印日志,甚至可以完全去掉循环,直接批量添加即可。
2. 性能优化的核心逻辑
不管用不用显式foreach,最关键的优化是把线性查找改成哈希查找:
- 用
HashSet<Guid>存储已有列表的GUID,它的Contains()方法是O(1)时间复杂度,远快于List的Any()(O(n)) - 优化后整体时间复杂度降到O(m + n),数据量大时性能提升非常明显
可选:用LINQ Except实现(需自定义比较器)
如果想直接用LINQ的Except方法去重合并,需要为MySecondGameList类实现一个相等比较器:
public class MySecondGameListComparer : IEqualityComparer<MySecondGameList> { public bool Equals(MySecondGameList x, MySecondGameList y) { if (x == null || y == null) return x == y; return x.guid == y.guid; } public int GetHashCode(MySecondGameList obj) { return obj.guid.GetHashCode(); } }
之后就能直接用Except筛选新增元素:
var newItems = myloadinglist.Except(GameData_List.my_loading_list, new MySecondGameListComparer()).ToList(); GameData_List.my_loading_list.AddRange(newItems);
这种方式适合需要多次复用GUID比较逻辑的场景,代码更简洁。
内容的提问来源于stack exchange,提问作者aron kan
相关产品推荐
相关产品推荐

