在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
相关产品推荐
相关产品推荐

