1

我必须解析一个字符串来创建一个PathSegmentCollection。该字符串由逗号和/或(任何)空格(如换行符、制表符等)分隔的数字组成,数字也可以使用科学记数法编写。

这是一个例子:"9.63074,9.63074 -5.55708e-006 0 ,0 1477.78"

点是:P1(9.63074, 9.63074), P2(-0,555708, 0), P3(0, 1477.78)

要提取数字,我使用正则表达式:

Dim RgxDouble As New Regex("[+-]?\b[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?\b")
Dim Matches As MatchCollection = RgxDouble.Matches(.Value)
Dim PSegmentColl As New PathSegmentCollection
Dim PFigure As New PathFigure

With Matches

  If .Count < 2 OrElse .Count Mod 2 <> 0 Then Exit Sub

  PFigure.StartPoint = New Point(.Item(0).Value, .Item(1).Value)

  For i As UInteger = 2 To .Count - 1 Step 2
    Dim x As Double = .Item(i).Value, y As Double = .Item(i + 1).Value
    PSegmentColl.Add(New LineSegment With {.Point = New Point(x, y)})
  Next

End With

它有效,但我必须解析大约十万个(或更多)字符串,而且这种方式太慢了。我想找到一个更有效的解决方案,而:大多数时候数字不是用科学记数法写的,如果你认为这是更好的方法,我可以使用用 C++/CLI 编写的使用 C/C++ 的程序集非托管代码或 C# 不安全代码。

4

1 回答 1

2

你为什么要自己解析路径标记语法?这是一件复杂的事情,也许是将来要改变(至少扩展)的主题。WPF 可以为您做到这一点:http: //msdn.microsoft.com/en-us/library/system.windows.media.geometry.parse.aspx,所以最好让框架工作。


编辑:
如果解析是您的瓶颈,您可以尝试自己解析。我建议尝试以下方法并检查它是否足够快:

char[] separators = new char[] { ' ', ',' }; // should be created only once
var parts = pattern.Split(separators, StringSplitOptions.RemoveEmptyEntries);
double firstInPair = 0.0;
for (int i = 0; i < parts.Length; i++ )
{
    double number = double.Parse(parts[i]);
    if (i % 2 == 0)
    {
        firstInPair = number;
        continue;
    }
    double secondInPair = number;
    // do whatever you want with the pair (firstInPair, secondInPair) ...
}
于 2012-04-07T10:16:56.350 回答