C# 如何使用LINQ填充自定义类型列表中X属性连续缺失的空白项
LINQ 实现方案
你可以通过构建X值的快速查找集合,配合连续整数序列生成直接得到结果,无需额外排序、遍历补插逻辑:
// 处理空列表的边界情况 if (!ListOfCustomTypes.Any()) { // 可按需调整空列表返回逻辑 return new List<CustomType>(); } // 构建X到Y的查找字典(如果X可能重复,可替换为ToLookup) var xToYMap = ListOfCustomTypes.ToDictionary(c => c.X, c => c.Y); int minX = ListOfCustomTypes.Min(c => c.X); int maxX = ListOfCustomTypes.Max(c => c.X); // 直接生成补全后的有序列表 var filledResult = Enumerable.Range(minX, maxX - minX + 1) .Select(x => new CustomType { X = x, Y = xToYMap.TryGetValue(x, out var existY) ? existY : 0 }) .ToList();
说明
- 该写法完全基于原生LINQ实现,逻辑简洁直观
- 时间复杂度为O(n),相比原实现先排序的O(nlogn)有更好的性能表现,数据量越大优势越明显
- 无需额外的合并、排序操作,生成的结果直接就是X值升序的目标列表
如果你的业务场景中X可能存在重复,把ToDictionary替换为ToLookup即可,对应取值逻辑调整为:
var xToYMap = ListOfCustomTypes.ToLookup(c => c.X, c => c.Y); // Select中的Y赋值改为 Y = xToYMap[x].FirstOrDefault()
内容的提问来源于stack exchange,提问作者ProGrammer
相关产品推荐
相关产品推荐

