You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:12:49