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"
)
4 Réponses :
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);
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];
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!
\ 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);
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();
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 ...