如何按平台找出两个不同对象列表中的缺失ValidGame
按平台查找缺失的ValidGame解决方案
核心思路
先将现有List<Game>按平台类型分组,得到每个平台下已上线的游戏ID集合,再对比全量List<ValidGame>,找出每个平台未覆盖的游戏。
实现步骤
- 筛选有效平台类型:排除
Unknown类型,仅处理iOS、Android这类实际运营平台。 - 按平台收集已存在的游戏ID:遍历所有Game,记录每个平台下已存在的Game的Id(去重避免重复统计)。
- 对比找出缺失项:针对每个平台,筛选出ValidGame中Id不在对应平台已存在ID集合里的项。
代码实现
// 假设已有这两个列表实例 List<Game> existingGames = ...; List<ValidGame> allValidGames = ...; // 1. 获取需要检查的目标平台(排除Unknown) var targetPlatforms = Enum.GetValues<Type>().Where(t => t != Type.Unknown); // 2. 构建每个平台对应的已存在Game的Id集合(用HashSet提升查找效率) var platformExistingGameIds = targetPlatforms.ToDictionary( platform => platform, platform => existingGames .Where(game => game.Platforms?.Any(p => p.PlatformType == platform) == true) .Select(game => game.Id) .ToHashSet() ); // 3. 计算每个平台缺失的ValidGame var platformMissingGames = targetPlatforms.ToDictionary( platform => platform, platform => allValidGames .Where(validGame => !platformExistingGameIds[platform].Contains(validGame.Id)) .ToList() ); // 示例:输出各平台缺失的游戏信息 foreach (var kvp in platformMissingGames) { Console.WriteLine($"【{kvp.Key}平台】缺失的游戏:"); foreach (var game in kvp.Value) { Console.WriteLine($"ID: {game.Id} | 名称: {game.Name}"); } }
关键细节说明
- 用
HashSet存储已存在的Game Id:Contains操作时间复杂度为O(1),远优于List的O(n),适合数据量较大的场景。 - 空值防护:通过
?.Any()处理game.Platforms可能为null的情况,避免空引用异常。 - 以
Id作为唯一标识:相比Name更可靠,避免同名不同游戏的误判。
内容的提问来源于stack exchange,提问作者Zenitha Mealthow
相关产品推荐
相关产品推荐

