有没有更好的方法来使用 LINQ 拆分此字符串
本文关键字:LINQ 拆分 字符串 更好 方法 有没有 | 更新日期: 2023-09-27 18:30:45
我有一些经度/纬度坐标聚集在一个字符串中,我想将其拆分为经度''纬度对。 多亏了stackoverflow,我已经能够想出一些linq,将其拆分为一个多维字符串数组。 有没有办法将字符串直接拆分为接受经度纬度的对象与字符串数组,然后创建对象?
string segment = "51.54398, -0.27585;51.55175, -0.29631;51.56233, -0.30369;51.57035, -0.30856;51.58157, -0.31672;51.59233, -0.3354"
string[][] array = segment.Split(';').Select(s => s.Split(',')).ToArray();
foreach (string[] pair in array)
{
//create object here
}
你很接近。这样的事情可能会有所帮助:
var pairSequence = segment.Split(';')
.Select(s => s.Split(','))
.Select(a => new { Lat = double.Parse(a[0]), Long = double.Parse(a[1]) });
假设你有一个带有public Coordinate(double x, double y)
构造函数的Coordinate
类,你可以这样做:
Coordinate[] result = segment
.Split(';')
.Select(s => s.Split(','))
.Select(a => new Coordinate(x: double.Parse(a[0], NumberStyles.Number),
y: double.Parse(a[1], NumberStyles.Number))
.ToArray();
或同等
var query = from item in segment.Split(';')
let parts = item.Split(',')
let x = double.Parse(parts[0], NumberStyles.Number)
let y = double.Parse(parts[1], NumberStyles.Number)
select new Coordinate(x, y);
Coordinate[] result = query.ToArray();
你可以
这样做:
public class GeoCoordinates {
public decimal Latitude { get; set; }
public decimal Longitude { get; set; }
public GeoCoordinates( string latLongPair ) {
decimal lat, lng;
var parts = latLongPair.Split( new[] { ',' } );
if( decimal.TryParse( parts[0], out lat ) &&
decimal.TryParse( parts[1], out lng ) ) {
Latitude = lat;
Longitude = lng;
} else {
// you could set some kind of "ParseFailed" or "Invalid" property here
}
}
}
然后,您可以这样创建地理坐标类的集合:
var coords = segment.Split( new[] {';'} ).Select( x => new GeoCoordinates( x ) );
这是一个"有点"不错的片段,显示:
- 预编译的正则表达式
- LINQ 到匿名类型投影
- 区域性感知(正确)数字解析和打印
您可能希望在现实生活中提取某些代码(例如数字解析)。
在 Ideone.com 上观看直播。
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;
namespace SODemo
{
class MainClass
{
private static readonly CultureInfo CInfo = CultureInfo.CreateSpecificCulture("en-US");
public static void Main (string[] args)
{
string segment = "51.54398, -0.27585;51.55175, -0.29631;51.56233, -0.30369;51.57035, -0.30856;51.58157, -0.31672;51.59233, -0.3354";
var re = new Regex(@"'s*(?<lat>[-+]?[0-9.]+),'s*(?<lon>[-+]?[0-9.]+)'s*;", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
var locations = re.Matches(segment).Cast<Match>().Select(m => new
{
Lat = decimal.Parse(m.Groups["lat"].Value, CInfo),
Long = decimal.Parse(m.Groups["lon"].Value, CInfo),
});
foreach (var l in locations)
Console.WriteLine(l);
}
}
}
输出:
{ Lat = 51,54398, Long = -0,27585 }
{ Lat = 51,55175, Long = -0,29631 }
{ Lat = 51,56233, Long = -0,30369 }
{ Lat = 51,57035, Long = -0,30856 }
{ Lat = 51,58157, Long = -0,31672 }
使用 LINQ 是必需的吗?您可以使用标准的字符串拆分功能完成所有操作:
string[] pairsOfCoords = segment.Split(';');
List<CoordsObject> listOfCoords = new List<CoordsObject>();
foreach (string str in pairsOfCoords)
{
string[] coords = str.Split(',');
CoordsObject obj = new CoordsObject(coords[0], coords[1]);
listOfCoords.Add(obj);
}
我可能会再补充一点。感谢 dtb 的开始,点赞。如果将解析函数分解,则可以更干净地处理错误条件,例如数组中的元素数量错误,或者未解析为小数的内容。
Coordinate[] result = segment
.Split(';')
.Select(s => s.Split(','))
.Select(BuildCoordinate)
.ToArray();
Coordrinate BuildCoordinate(string[] coords)
{
if(coords.Length != 2)
return null;
return new Coordinate(double.Parse(a[0].Trim(), double.Parse(a[1]);
}
有些任务只是更容易解决旧方法:
var split = segment.Split();
var coordinates = new List<Coordinate>(split.Length);
foreach(string s in split)
{
coordinates.Add(new Coordinate(s));
}