从字符串初始化点数组

本文关键字:数组 初始化 字符串 | 更新日期: 2023-09-27 18:11:23

它们是将string转换为Point[]的快速方法(一行或两行(吗?

我的字符串:"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)
};

从字符串初始化点数组

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();

Regex也可以用于

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 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));
}

这就假设1(列表是可以的。如果没有,请调用ToArray,2(您可以控制传入的数据,并确信Convert.ToIn32永远不会失败。

编辑-

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

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)); }

事实上,我不认为这是可行的。你为什么要一行?上述解决方案是否运行太慢?我怀疑情况是否如此。

也许这是一个

"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 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();

有一个使用linq的one-liner,尽管它不对输入进行任何健全性检查。