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

動作しますが、約10万(またはそれ以上)の文字列を解析する必要があり、この方法では遅すぎます。より効率的な解決策を見つけたいのですが、ほとんどの場合、数値は科学的記数法で書かれていません。それがより良い方法だと思うなら、C /C++を使用するC++/CLIで書かれたアセンブリを使用しても問題ありません。マネージコードではない、または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 に答える