如何用LINQ将扁平XY字符串列表转换为IEnumerable<Point>?
用LINQ将扁平字符串列表转换为IEnumerable
你可以通过Enumerable.Range + Select的组合实现需求,完全不需要创建中间列表,且性能和你写的枚举器函数相差无几。
LINQ实现代码
using System.Windows; using System.Linq; public static IEnumerable<Point> ToPoints(IReadOnlyList<string> list) { if (list.Count % 2 != 0) throw new ArgumentException("元素数量必须为偶数,无法组成完整的XY坐标对"); return Enumerable.Range(0, list.Count / 2) .Select(i => new Point( double.Parse(list[i * 2]), double.Parse(list[i * 2 + 1]) )); }
实现说明
- 这个写法是延迟执行的,和你自己写的枚举器一样,只有在遍历结果的时候才会逐个解析字符串、生成Point对象,不会提前把所有数据加载到内存里。
- 用
Enumerable.Range生成点的索引序列(从0到总点数-1),避免了用Skip/Take带来的重复遍历问题(Skip/Take会导致O(n²)的时间复杂度,远不如直接索引访问高效)。 - 性能上,仅比你的枚举器多了一层委托调用的微小开销,在绝大多数业务场景下完全可以忽略。
你原有的枚举器实现(作为对比)
using System.Windows; private static IEnumerable<System.Windows.Point> EnumeratePoints(IReadOnlyList<string> list) { var numPoints = list.Count / 2; if (list.Count % 2 != 0) throw new ArgumentException("Invalid # of points"); for (var i = 0; i < numPoints; ++i) { var idx = i * 2; yield return new Point(double.Parse(list[idx]), double.Parse(list[idx+1])); } }
如果追求极致的性能,你自己写的枚举器会略胜一筹;但如果更看重代码的简洁性和可读性,LINQ的写法是更好的选择。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

