【问题标题】:Initialize Point Array from String从字符串初始化点数组
【发布时间】:2014-08-23 18:46:41
【问题描述】:

它们是将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)
};

【问题讨论】:

    标签: c# asp.net arrays split converter


    【解决方案1】:
    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();
    

    【讨论】:

    • 太棒了!他们也是对这个数组执行此操作的一种方法:“10,10,10,20,20,20,20,10,10,10”? (只是逗号)
    【解决方案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();
    

    【讨论】:

      【解决方案3】:

      没有你想要的那么短——但这会起作用:

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

      现实情况是,我认为这在一行中是不可行的。为什么要单行?上述解决方案运行速度是否太慢?我怀疑是这样的。

      【讨论】:

      • @inon:“一行代码”并不一定意味着生成的代码更快或更容易维护。即使使用 Linq,您仍在拆分字符串,然后遍历该集合。
      【解决方案4】:

      也许这个

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

      在字符串中的每个; 处拆分。然后取出每个元素,转换成一个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);
      }
      

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

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

      【讨论】:

      • 这个结果是字符串[]。我需要点[]
      • @inon,我正在写出来,抱歉耽搁了。现在就有答案了。
      • 如果您只是删除空格和换行符,则可以使用此代码制作一两个。那么它将是一个(但很长)行。
      【解决方案5】:
      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 的单行,尽管它不对输入进行任何完整性检查。

      【讨论】:

        猜你喜欢
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 2016-03-15
        相关资源
        最近更新 更多