C# 从字符串初始化点数组

C# 从字符串初始化点数组,c#,asp.net,arrays,split,converter,C#,Asp.net,Arrays,Split,Converter,这是一种将字符串转换为点[]的快速方法(一行或两行) 我的字符串:“10,10;10,20;20,20;20,10;10,10” 通缉结果: Point[] point = new Point[5] { new Point(10, 10), new Point(10, 20), new Point(20, 20), new Point(20, 10), new Point(10, 10) }; 也许是这个 "10,10;10,20;20,20;20,1

这是一种将
字符串
转换为
点[]
的快速方法(一行或两行)

我的字符串:
“10,10;10,20;20,20;20,10;10,10”

通缉结果:

Point[] point = new Point[5] 
{
    new Point(10, 10),
    new Point(10, 20),
    new Point(20, 20),
    new Point(20, 10),
    new Point(10, 10)
};
也许是这个

"10,10;10,20;20,20;20,10;10,10".Split(';');
在每个
处拆分。然后取出每个元素,并将其转换为一个点

string mainString = "10,10;10,20;20,20;20,10;10,10";
string[] stringArray = mainString..Split(';');
Point[] pointArray;
// convert them
foreach (var point in stringArray) {
  // each object in array.
   var eachItem = point.Split(','); // you have [10, 10]
   var x = eachItem[0];
   var y = eachItem[1];
   Point pointItem = new Point(x, y);
   pointArray.Add(pointItem);
}
你完了!不会是一条线。实际上,单行代码用于将对象转换为对象。但是,因为您要从对象中取出数据,然后对其进行处理,然后将其转换为其他数据类型。这就是为什么,你会被要求去做它


上面的代码显示了如何创建数据数组,然后将其转换为单个点,然后将这些点推送到点数组中。

并没有您希望的那个么短,但这将起作用:

var values = "10,10;10,20;20,20;20,10;10,10";
var result = new List<Point>();

foreach (var point in values.Split(';'))
{
    var split = point.Split(',');
    var x = Convert.ToInt32(split[0]);
    var y = Convert.ToInt32(split[1]);
    result.Add(new Point(x, y));
}
var values=“10,10;10,20;20,20;20,10;10,10”;
var result=新列表();
foreach(值中的变量点。拆分(';'))
{
var split=点分割(',');
var x=转换为32(拆分[0]);
变量y=转换为32(拆分[1]);
结果。添加(新点(x,y));
}
这就假设1)列表是可以的。如果没有,请致电Array,2)控制传入的数据,并确保Convert.ToIn32不会失败

编辑-

这是您的单线解决方案:)

var values=“10,10;10,20;20,20;20,10;10,10”;var result=新列表();foreach(var point in values.Split(“;”){var Split=point.Split(“,”);var x=Convert.ToInt32(Split[0]);var y=Convert.ToInt32(Split[1]);result.Add(new point(x,y));}
事实是,我认为这不是一条可行的路线。你为什么要一条线?上述解决方案运行是否太慢?我怀疑是这样。

Regex也可以使用

string s = "10,10;10,20;20,20;20,10;10,10";
var points = s.Split(';').Select(x=>x.Split(','))
              .Select(y=>new Point(int.Parse(y[0]),int.Parse(y[1])))
              .ToArray();
string input = "10,10;10,20;20,20;20,10;10,10";
Point[] points = Regex.Matches(input, @"(\d+),(\d+)").Cast<Match>()
                .Select(m => new Point(int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value)))
                .ToArray();
string input=“10,10;10,20;20,20;20,10;10,10”;
Point[]points=Regex.Matches(输入,@“(\d+),(\d+))).Cast()
.Select(m=>newpoint(int.Parse(m.Groups[1].Value),int.Parse(m.Groups[2].Value)))
.ToArray();

有一个使用linq的单行程序,尽管它没有对输入进行任何健全性检查。

结果是字符串[]。我需要点[]@inon,我正在写,抱歉耽搁了。现在就有你的答案。如果你只需删除空格和新行字符,就可以从这段代码中找出一两个。那么它将是一行(但很长)。@inon:“一行代码”并不一定意味着生成的代码更快或更易于维护。即使使用Linq,您仍然在拆分字符串,然后迭代该集合。太棒了!他们对这个数组也是这样做的:“10,10,10,20,20,20,20,20,10,10,10”?(只有逗号)
string input = "10,10;10,20;20,20;20,10;10,10";
Point[] points = Regex.Matches(input, @"(\d+),(\d+)").Cast<Match>()
                .Select(m => new Point(int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value)))
                .ToArray();
var instring = "10,10;10,20;20,20;20,10;10,10";
var points =
    instring.Split(';')
    .Select(a => a.Split(','))
    .Select(a => new Point(Convert.ToInt32(a[0]), Convert.ToInt32(a[1])))
    .ToArray();