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

如何无需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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:15:08