C# 是否有更好的方法使用LINQ拆分此字符串?

C# 是否有更好的方法使用LINQ拆分此字符串?,c#,linq,C#,Linq,我有一些经度/纬度坐标聚集在一个字符串中,我想分成经度/纬度对。多亏了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.

我有一些经度/纬度坐标聚集在一个字符串中,我想分成经度/纬度对。多亏了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]) });

假设您有一个带有公共坐标(双x,双y)构造函数的
坐标
类,您可以执行以下操作:

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();

是否有必要使用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);
}
string[]pairsofords=segment.Split(“;”);
List LISTOCOORDS=新列表();
foreach(成对单词中的字符串str)
{
字符串[]coords=str.Split(',');
CoordsObject obj=新的CoordsObject(coords[0],coords[1]);
添加(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]);
}
您可以这样做:

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到匿名类型投影
  • 区域性识别(正确)数字解析和打印
您可能希望在现实生活中提取某些代码(例如数字解析)

查看它

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);
        }
    }
}

有些任务用老方法更容易解决:

var split = segment.Split();
var coordinates = new List<Coordinate>(split.Length);
foreach(string s in split)
{
    coordinates.Add(new Coordinate(s));
}
var split=segment.split();
变量坐标=新列表(拆分长度);
foreach(拆分中的字符串s)
{
坐标。添加(新坐标);
}

使用linq拆分字符串(几乎?)从来都不是一个好方法。也就是说,System.Text.RegularExpressions就是你想要的那是什么“在字符串的末尾?@sehe:在这样一个琐碎的任务中使用正则表达式太过分了。如果您知道输入的格式是常量,并且很容易通过拆分进行解析,那么您应该使用拆分而不是正则表达式。@TimSchmelter抱歉,这里有一些额外的数据。@Se他不太喜欢RegualrExpressions,但我很欣赏这个答案。@Alex当然,这取决于您实际需要的类型。你明白了,该死。正在写一些几乎相同的东西。很好。是的,但是看看林克有多干净。:)@罗伯特普:我想这是主观的。对我来说,这看起来很简单,很干净。嘿…StackOverflow可能是一场相当激烈的比赛,不是吗?
var split = segment.Split();
var coordinates = new List<Coordinate>(split.Length);
foreach(string s in split)
{
    coordinates.Add(new Coordinate(s));
}