1
votes

Lire les coordonnées dans une chaîne

Je veux lire les coordonnées d'une chaîne qui ressemble à ceci:

string coordinate = "20, 10   10, 20";

int x1 = 20;
int y1 = 10;
int x2 = 10;
int y2 = 20;

Je veux stocker chaque nombre dans une variable entière séparée.

Cela ne devrait pas avoir d'importance quels nombres il y a réellement. Donc au lieu de "20,10 10,20" , il pourrait y avoir n'importe quoi ... ( "x1, y1 x2, y2" )


5 commentaires

Y a-t-il toujours trois espaces entre les ensembles de coordonnées? Et comment comptez-vous attribuer le résultat à ints si c'est quelque chose comme "john, paul george, ringo" ?


Quel contrôle avez-vous sur le formatage de la chaîne?


il n'y aura jamais de nom ou quelque chose comme ça. Seulement les chiffres. et OUI, il y a toujours 3 espaces entre la première et la deuxième coordonnée.


Vous souciez-vous qu'il y ait un espace après la virgule?


J'ai déjà résolu ce problème, merci quand même ...


4 Réponses :


1
votes

Comme fotmat n'est pas clairement spécifié et que certaines valeurs indésirables telles que "x1, y1" peuvent apparaître, je suggère des expressions régulières pour correspondre à

em> points valides, par exemple

Code:

{X=20, Y=10}
{X=10, Y=20}

Résultat:

  using System.Linq; 
  using System.Text.RegularExpressions;

  ....

  string coordinate = "20, 10   10, 20";

  Regex regex = new Regex(@"(?<x>-?[0-9]+),\s*(?<y>-?[0-9]+)");

  var points = regex
    .Matches(coordinate)
    .Cast<Match>()
     // I've put Point but you may want different class / struct
    .Select(match => new Point(int.Parse(match.Groups["x"].Value), 
                               int.Parse(match.Groups["y"].Value)))
    .ToArray(); // Let's materialize into an array

  // int x1 = points[0].X;
  // int y1 = points[0].Y;
  // int x2 = points[1].X;
  // int y2 = points[1].Y;

  Console.WriteLine(Environment.NewLine, points);


0 commentaires

2
votes

Vous pouvez utiliser la fonction split :

string coordinate = "20, 10   10, 20";
var splitted = coordinate.Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries)
                         .ToList();
var x1 = splitted[0];
var y1 = splitted[1];
var x2 = splitted[2];
var y2 = splitted[3];


2 commentaires

Au lieu de la clause where , vous pouvez utiliser Split (new [] {'', ','}, StringSplitOptions.RemoveEmptyEntries)


@RobinBennett merci beaucoup pour le super commentaire! Le code est devenu plus propre, plus clair et plus court! Merci!



1
votes

\ d + correspondra à tous les nombres de la chaîne. Vous pouvez également utiliser -? \ D + pour faire correspondre également les valeurs négatives.

string coordinate = "20, 10   10, 20";
var points = Regex.Matches(coordinate, @"\d+");
int x1 = int.Parse(points[0].Value);
int y1 = int.Parse(points[1].Value);
int x2 = int.Parse(points[2].Value);
int y2 = int.Parse(points[3].Value);


0 commentaires

0
votes

Pour analyser la chaîne en tableau int, j'utiliserais LINQ:

    var pointsStrings = coordinates.Split(new[] {"   "}, StringSplitOptions.RemoveEmptyEntries);
    var points = pointsStrings
        .Select(ps => ps.Split(new[] {", "}, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray())
        .Select(ps => new { X = ps[0], Y = ps[1]});

    foreach (var point in points)
    {
        Console.WriteLine($"X = {point.X}, Y = {point.Y}");
    }

Mais vous feriez mieux d'utiliser class / struct ou anonymous class pour déclarer votre point:

string coordinates = "20, 10   10, 20";
var points = coordinates
                       .Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries)
                       .Select(int.Parse)
                       .ToArray();


0 commentaires