2012-04-07 237 views
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/C++編寫的使用C/C++編寫的程序集就沒有問題不是託管代碼或C#不安全代碼。

+2

您應該添加具有感興趣語言的標籤 - 我不認爲很多人將「字符串」作爲主題進行跟蹤,而許多人則遵循C# ,VB或C++(或者您認爲與您的問題相關的任何其他語言)。 – assylias 2012-04-07 10:02:47

+0

完成(.NET和C++/CLI相關),謝謝。 – gliderkite 2012-04-07 10:10:02

+0

順便說一句,'-5.55708e-006'不是'-0,555708',它是'-0,00000555708'。 – Vlad 2012-04-07 10:13:34

回答

2

你爲什麼試圖自己解析path markup syntax?這是一件複雜的事情,也許是將來要改變(至少延長)的一個主題。 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) ... 
} 
+0

因爲不是路徑標記語法。這只是一個數字序列,Parse方法不能解析我的字符串。但是,如果我更改字符串也許它可以工作,我必須測試它。 – gliderkite 2012-04-07 10:34:31

+0

@gliderkite:好吧,是不是來自某些路徑描述的字符串?如果不是,則嘗試在「L」前加上字符串,以便它成爲有效的路徑。 – Vlad 2012-04-07 10:43:33

+0

我必須插入'M'作爲第一個字符,'L'作爲第二個數字,'z'作爲最後一個字符。任何想法? – gliderkite 2012-04-07 10:47:42