如何基于索引对比两个等长List并在GroupBy中获取重复元素的索引
实现方案
你可以通过Select的带索引重载,先把每个值和它对应的原列表索引绑定,再执行分组操作即可,完整代码如下:
private bool CheckIfSameUsersHaveSameServices(List<string> multipleJMBGs, List<BundleSchedule> schedules) { // 先绑定每个JMBG和对应的原列表索引 var duplicateGroups = multipleJMBGs .Select((jmbg, index) => new { jmbg, index }) .GroupBy(x => x.jmbg) .Where(g => g.Count() > 1) // 每个分组返回JMBG值和对应的所有索引集合 .Select(g => new { Jmbg = g.Key, Indexes = g.Select(x => x.index).ToList() }) .ToList(); foreach (var group in duplicateGroups) { // 取出当前重复JMBG对应的所有Schedule的服务ID去重后的数量 var distinctServiceIdCount = group.Indexes .Select(i => schedules[i].ServiceTypeComplexityId) .Distinct() .Count(); // 校验逻辑可根据你的实际需求调整: // 场景1:要求所有重复JMBG对应的服务ID必须相同,只要有一组不满足就返回校验失败 if (distinctServiceIdCount != 1) { return false; } // 场景2:只要存在任意一组重复JMBG对应的服务ID相同就返回true,打开下面注释即可 // if (distinctServiceIdCount == 1) // { // return true; // } } // 对应场景1的最终返回:所有重复组都满足要求则返回校验通过 return true; }
核心逻辑说明
- 用到了
Select的带索引参数重载:Func<TSource, Int32, TResult>,第二个入参就是元素在原序列中的索引,提前把值和索引绑定为匿名类后再分组,就能直接从分组结果里拿到同一值对应的所有索引 - 该实现支持单个JMBG出现3次及以上重复的场景,比你原本用字典存两两索引对的方案兼容性更强
内容的提问来源于stack exchange,提问作者lonelydev101
相关产品推荐
相关产品推荐

