9

経度\緯度のペアに分割したい文字列にまとめられた経度\緯度の座標があります。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
}
4

7 に答える 7

24

あなたは近くにいます。このようなものが役立つかもしれません:

var pairSequence = segment.Split(';')
        .Select(s => s.Split(','))
        .Select(a => new { Lat = double.Parse(a[0]), Long = double.Parse(a[1]) });
于 2012-04-09T21:54:36.173 に答える
6

Coordinateコンストラクターを持つクラスがあると仮定するとpublic Coordinate(double x, double 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();
于 2012-04-09T21:55:27.047 に答える
3

これが「やや」素敵なスニペットです。

  • プリコンパイルされたregexen
  • 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 }
于 2012-04-09T22:04:39.803 に答える
3

あなたはこれを行うことができます:

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

次に、GeoCoordinate クラスのコレクションを次のように作成できます。

var coords = segment.Split( new[] {';'} ).Select( x => new GeoCoordinates( x ) );
于 2012-04-09T22:01:14.187 に答える
2

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);
}
于 2012-04-09T21:55:44.033 に答える
1

もう少し追加するかもしれません。最初に賛成票を投じてくれた dtb に感謝します。解析関数を分割すると、配列内の要素の数が間違っている、または 10 進数に解析されないなどのエラー状態をより明確に処理できます。

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]);
}
于 2012-04-09T22:00:52.950 に答える