C# 如何从用户提供的字符串中解析整数

C# 如何从用户提供的字符串中解析整数,c#,string,parsing,C#,String,Parsing,我有一个规范,用户需要输入一组坐标,如: {{2,3}, {9,0}} 这些是二维轴上直线的坐标 我想在运行时在C#中动态解析这个用户输入字符串,并在二维数组中输入这些坐标。我知道我们可以做硬编码: int[,] CoOrdinates = {{2,3}, {9,0}}; 但是我不知道如何让用户输入一个字符串,并从字符串中获取坐标以动态存储在数组中 我正在使用Console.Readline();让用户输入坐标 请帮忙,谢谢 我将使用正则表达式(C#中的类)解析出所需字符串的位,然后Int3

我有一个规范,用户需要输入一组坐标,如:

{{2,3}, {9,0}}
这些是二维轴上直线的坐标

我想在运行时在C#中动态解析这个用户输入字符串,并在二维数组中输入这些坐标。我知道我们可以做硬编码:

int[,] CoOrdinates = {{2,3}, {9,0}};
但是我不知道如何让用户输入一个字符串,并从字符串中获取坐标以动态存储在数组中

我正在使用Console.Readline();让用户输入坐标


请帮忙,谢谢

我将使用正则表达式(C#中的类)解析出所需字符串的位,然后
Int32.TryParse()
将字符串转换为数字。是构造正则表达式的好资源,也是我首选的正则表达式测试工具。祝你好运。

string s=“{2,3},{9,0}”;
            string s = "{{2,3}, {9,0}}";
            string p = "{(?<x>\\d),(?<y>\\d)}";
            Regex regex = new Regex(p);
            MatchCollection ms = regex.Matches(s);
            int[,] cood = new int[ms.Count, ms.Count];
            int i =0;
            foreach (Match m in ms)
            {
                cood[i,0] = int.Parse(m.Groups["x"].Value);
                cood[i, 1] = int.Parse(m.Groups["y"].Value);
                i++;
            }
字符串p=“{(?\\d),(?\\d)}”; 正则表达式正则表达式=新正则表达式(p); MatchCollection ms=regex.Matches; int[,]cood=新int[ms.Count,ms.Count]; int i=0; foreach(匹配m,毫秒) { cood[i,0]=int.Parse(m.Groups[“x”].Value); cood[i,1]=int.Parse(m.Groups[“y”].Value); i++; }
如果坐标中的值不正确,则可以使用TryParse快速回答:

    public void IntegerReader()
    {
        string integers = Console.ReadLine();

        string[] split = integers.Split(',');

        int result;

        foreach (string s in split)
        {
            if (!string.IsNullOrEmpty(s.Trim()))
                if (int.TryParse(s.Trim(), out result))
                    Console.WriteLine(result);
        }
    }

这不是非常优雅,但我认为结果是你所期望的

string coords = "{{2,3}, {9,0}}";
string matchPattern = @"\{\{(?<x1>\d{1})\,(?<y1>\d{1})\}\,\s*\{(?<x2>\d{1})\,(?<y2>\d{1})\}\}";

var matches = Regex.Match(coords, matchPattern);

int[,] values = new int[2,2];

int.TryParse(matches.Groups["x1"].ToString(), out values[0,0]);
int.TryParse(matches.Groups["y1"].ToString(), out values[0,1]);

int.TryParse(matches.Groups["x2"].ToString(), out values[1,0]);
int.TryParse(matches.Groups["y2"].ToString(), out values[1,1]);

/* Result:
 *    0  1
 *   -----
 * 0| 2  3
 * 1| 9  0
 */
string-coords=“{2,3},{9,0}”;
字符串匹配模式=@“{{(?\d{1})\,(?\d{1})\}\,\s*{(?\d{1})\,(?\d{1})\}”;
var matches=Regex.Match(坐标、匹配模式);
int[,]值=新的int[2,2];
int.TryParse(匹配.Groups[“x1”].ToString(),out值[0,0]);
int.TryParse(匹配.Groups[“y1”].ToString(),out值[0,1]);
int.TryParse(匹配.Groups[“x2”].ToString(),out值[1,0]);
int.TryParse(匹配.Groups[“y2”].ToString(),out值[1,1]);
/*结果:
*    0  1
*   -----
* 0| 2  3
* 1| 9  0
*/

当然,在将值分配给矩形数组之前,您需要检查是否返回了四个组,但这应该很容易实现。

您可能需要使用System.Drawing.Point结构,它基本上是x,ypairs@Oded,因为字符串是数组,我试图从它们的位置提取字符,如:“string inputCoOds=Console.ReadLine();int CoOd1X=int.Parse(inputCoOds[2].ToString());int CoOd1Y=int.Parse(inputCoOds[4].ToString());`这有点难看,不通用,所以我想要一个更优雅的解决方案。我会用
TryParse
来代替。@Daniel同意,
TryParse
更可取。@jlafay您在控制台应用程序中试过吗?否则,它将给出一个异常,因为integers从Console获取其值。ReadLine()我尝试了一个具有OP指定的指定坐标格式的字符串。你试过了吗?我想也许你的拆分不起作用。正如我在回答中所说的,我只是用逗号作为分隔符快速地给出了一个。只是为了让他有个主意。他可以在Split menthod中更改分隔符列表,以包括他想要的所有分隔符。