从String初始化点数组

时间:2014-07-02 20:13:42

标签: c# asp.net arrays split converter

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

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

也可以使用正则表达式

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

答案 2 :(得分:0)

也许这一个

"10,10;10,20;20,20;20,10;10,10".Split(';');

在String中的每个;处拆分。然后取出每个元素,并将其转换为Point。

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

你已经完成了!它不会是一条线。实际上,一个行代码用于将对象转换为对象。但是,由于您要从对象中取出数据然后再处理它,然后将其转换为其他数据类型。这就是为什么,你将被要求处理它。

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

答案 3 :(得分:0)

不像你想要的那么短 - 但这会奏效:

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

现实情况是,我不认为这是可行的。你为什么要一条线?以上解决方案运行得太慢了吗?我怀疑是这样的。

答案 4 :(得分:0)

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有一个班轮,虽然它没有对输入进行任何健全性检查。