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

在C#中如何将XElement内的坐标字符串解析为double数组?

嘿,我处理KML数据的时候也遇到过类似需求!针对你这个场景,我可以给你几个比“先空格分割再逗号分割”更健壮、高效的方案,分情况来看:

1. 简洁优先:用LINQ链式处理(最常用)

这种方法可读性强,代码简洁,能处理KML坐标里可能存在的换行、制表符等各种空白字符,还会自动过滤空字符串:

using System.Globalization;
using System.Linq;
using System.Xml.Linq;

// 假设你的XElement实例是coordinatesElement
var coordinatesText = coordinatesElement.Value.Trim();

// 转换成一维double数组(所有坐标按顺序排列)
double[] coordinatesArray = coordinatesText
    .Split(new[] { ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)
    .SelectMany(coordPair => coordPair.Split(','))
    .Select(s => double.Parse(s, CultureInfo.InvariantCulture))
    .ToArray();

// 如果需要二维数组(每个元素是[经度, 纬度]的坐标对)
double[][] coordinatePairs = coordinatesText
    .Split(new[] { ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(coordPair => coordPair.Split(',')
        .Select(s => double.Parse(s, CultureInfo.InvariantCulture))
        .ToArray())
    .ToArray();

这里特意加上了CultureInfo.InvariantCulture,是为了避免在非英语环境下(比如系统默认用逗号做小数点)解析失败,这个细节很重要!

2. 性能优先:手动解析(适合超大量坐标)

如果你的KML包含几万甚至几十万条坐标,多次字符串拆分的开销会比较大。这时可以用手动遍历字符+Span的方式,减少内存分配,提升性能:

using System.Globalization;
using System.Collections.Generic;
using System.Xml.Linq;

var text = coordinatesElement.Value;
var coordinateList = new List<double>();
int startIndex = 0;

for (int i = 0; i < text.Length; i++)
{
    char currentChar = text[i];
    // 遇到分隔符(空格、制表符、换行、逗号)时解析当前段
    if (currentChar is ' ' or '\t' or '\n' or '\r' or ',')
    {
        if (i > startIndex)
        {
            // 使用Span避免创建子字符串,提升性能
            if (double.TryParse(
                text.AsSpan(startIndex, i - startIndex),
                NumberStyles.Float,
                CultureInfo.InvariantCulture,
                out double value))
            {
                coordinateList.Add(value);
            }
            // 这里可以添加解析失败的处理逻辑,比如记录错误日志
        }
        startIndex = i + 1;
    }
}

// 处理最后一段坐标
if (startIndex < text.Length)
{
    if (double.TryParse(
        text.AsSpan(startIndex),
        NumberStyles.Float,
        CultureInfo.InvariantCulture,
        out double finalValue))
    {
        coordinateList.Add(finalValue);
    }
}

double[] coordinatesArray = coordinateList.ToArray();

总结

  • 日常开发用第一种LINQ方案就足够了,代码清晰易维护;
  • 处理超大体积的KML文件时,再考虑第二种手动解析的方法;
  • 无论哪种方案,都别忘记指定CultureInfo.InvariantCulture,避免跨区域解析错误。

内容的提问来源于stack exchange,提问作者ZackOfAllTrades

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:05:53