C#中如何获取List2中未在List1首尾出现的连续缺失元素?
获取List2中开头/结尾连续缺失元素的最简方法
核心思路是:先定位List1对应元素在List2中的首尾位置,再截取List2中该位置之前的开头缺失部分,以及位置之后的结尾缺失部分,合并结果即可。
步骤与代码示例
假设Segment类可通过某个属性(比如Point)关联到List2中的Point元素,具体实现如下:
// 从List1中提取对应的Point序列(根据你的Segment结构调整属性名) var list1Points = segments.Select(s => s.Point).ToList(); int startIndex = 0; // 找到List2中第一个出现在list1Points里的元素索引 while (startIndex < points.Count && !list1Points.Contains(points[startIndex])) { startIndex++; } int endIndex = points.Count - 1; // 找到List2中最后一个出现在list1Points里的元素索引 while (endIndex >= 0 && !list1Points.Contains(points[endIndex])) { endIndex--; } // 提取开头缺失的元素:List2从0到startIndex-1的部分 var missingStart = points.Take(startIndex).ToList(); // 提取结尾缺失的元素:List2从endIndex+1到末尾的部分 var missingEnd = points.Skip(endIndex + 1).ToList(); // 合并所有缺失的开头和结尾元素 var allMissing = missingStart.Concat(missingEnd).ToList();
优化说明
如果Point类型未正确重写Equals和GetHashCode,或者需要自定义匹配逻辑,可把list1Points.Contains(...)替换为自定义判断,比如:
!list1Points.Any(p => p.Id == points[startIndex].Id)
若List1为空,startIndex会走到points.Count,endIndex会走到-1,此时missingStart就是整个List2,missingEnd为空,符合预期。
内容的提问来源于stack exchange,提问作者Ziad
相关产品推荐
相关产品推荐

