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