You need a way of accepting
a string containing a textual representation of an object and
converting it to an object usable by your application. For example,
if you were provided with the string representation of a line
(x1, y1)(x2, y2)
, you would want to convert it
into a Line
structure.
Implement a Parse
method on your Line
structure:
using System; using System.Text; using System.Text.RegularExpressions; public struct Line { public Line(int startX, int startY, int endX, int endY) { x1 = startX; x2 = endX; y1 = startY; y2 = endY; } public int x1; public int y1; public int x2; public int y2; public static Line Parse(string stringLine) { if (stringLine == null) { throw (new ArgumentNullException("stringLine", "A null cannot be passed into the Parse method.")); } // Take this string (x1,y1)(x2,y2) and convert it to a Line object int X1 = 0; int Y1 = 0; int X2 = 0; int Y2 = 0; MatchCollection MC = Regex.Matches(stringLine, @"s*(s*(?<x1>d+)s*,s*(?<y1>d+)s*)s* (s*(?<x2>d+)s*,s*(?<y2>d+)s*)" ); if (MC.Count == 1) { Match M = MC[0]; X1 = int.Parse(M.Groups["x1"].Value); Y1 = int.Parse(M.Groups["y1"].Value); X2 = int.Parse(M.Groups["x2"].Value); Y2 = int.Parse(M.Groups["y2"].Value); } else { throw (new ArgumentException( "The value " + stringLine + " is not a well formed Line value.")); } return (new Line(X1, Y1, X2, Y2)); } }
The Parse
method is used to reconstruct one data
type—in this case, a String
—into the
data type containing that Parse
method. For
example, if the string "123
" were passed into the
int.Parse
method, the numeric data type
123
would be extracted and then returned. Many
other types in the FCL use a Parse
method to
reconstruct an object of its own type from another data type, such as
a string. Note that you are not limited as far as the type and number
of parameters that can be passed into this method. As an example, see
how the DateTime.Parse
and
DateTime.ParseExact
methods are defined and
overloaded.
The parsing of a string containing the start and end coordinates of a
line is a little more difficult. To make things easier, we use a
regular expression to extract the beginning and ending
X
and Y
coordinates.
The regular expression parses out the individual coordinate values
provided by the stringLine
string parameter. Each
found coordinate is passed on to the static
int.Parse
method on the int
structure. This final step obtains the final parsed integer values
from the matches produced by the regular expression. If the regular
expression does not extract the required coordinates, we can assume
that the stringLine
parameter does not contain a
well-formed string that can be converted to a Line
object.
The following code:
Console.WriteLine("Line.Parse("(12,2)(0,45)") = " + Line.Parse("(12,2)(0,45)")); Console.WriteLine("Line.Parse("(0,0)(0,0)") = " + Line.Parse("(0,0)(0,0)"));
produces this output:
Line.Parse("(12,2)(0,45)") = (12,2) (0,45) Line.Parse("(0,0)(0,0)") = (0,0) (0,0)