2016-04-08 6 views
1

I glaube, ein Wörterbuch ist richtig für diesen Job, aber bin mir nicht sicher. Die Anwendung: Analysieren von CNC-Maschinencode (Text), Identifizieren von Sequenzen in dem Code und Speichern eines für jede Sequenz spezifischen Wörterbuchs. Anzahl der Sequenzen variiert. Zeilennummern werden gespeichert, wenn wichtiger Code gefunden wird. Wenn dies abgeschlossen ist, kann der Text noch einmal wiederholt werden, wobei die gespeicherten Zeilennummern als Flags verwendet werden, um nach Bedarf Änderungen vorzunehmen.Gibt es eine Möglichkeit, ein Wörterbuch dynamisch in vb.net zu deklarieren?

Ich habe dieses Problem in der Vergangenheit gelöst, aber die Lösung beinhaltete Looping wie verrückt und die gleichen Daten wiederholt zu lesen. Es sollte viel sauberer sein.

Hier ist, wo ich mit der Logik für diesen neuen Versuch bekommen habe. Ich möchte ein Wörterbuch dynamisch deklarieren, weiß aber nicht, ob es möglich ist.

Dim in_list As New List(Of String) 
Dim sequences As New Dictionary(Of Integer, Dictionary(Of String, Decimal)) 
Try 
    Dim S100 As New Dictionary(Of String, Decimal) 
    Dim S200 As New Dictionary(Of String, Decimal) 
    ' 
    'Dim S5000 as New Dict... come on, now. 
    ' 
    Dim reader As New StreamReader(filename) 
    Dim sequence_number As Integer = 0 
    Dim line_number As Integer = -1 
    Do While reader.Peek <> -1 
     Dim L As String = reader.ReadLine 
     line_number += 1 
     in_list.Add(L) 
     'Will be parsing differently, but string.indexof() for example: 
     If L.IndexOf("M6") > -1 Then 'M6 marks the beginning of a sequence. 
      sequence_number += 100 
      If sequence_number = 100 Then 
       sequences.Add(sequence_number, S100) 
       sequences(sequence_number).Add("M6", line_number) 
      End If 
      If sequence_number = 200 Then 
       sequences.Add(sequence_number, S200) 
       sequences(sequence_number).Add("M6", line_number) 
      End If 
      ' 
      ' If sequence_number = 5000... 
      ' really dude? 
      ' 
     End If 

     'Below is not the problem, but may help for suggestions in case 
     ' a dictionary should not be used, or any suggestion. 
     If sequence_number > 0 And sequences.ContainsKey(sequence_number) Then 
      If L.IndexOf("F") > -1 Then 
       If Not sequences(sequence_number).ContainsKey("first_F") Then 
        sequences(sequence_number).Add("first_F", line_number) 
       End If 
       If Not sequences(sequence_number).ContainsKey("last_F") Then 
        sequences(sequence_number).Add("last_F", line_number) 
       Else 
        sequences(sequence_number).Item("last_F") = line_number 
       End If 
      End If 
     End If 
    Loop 
    reader.Close() 
Catch ex As Exception 
End Try 

Ein Bit des Codes ich Parsen bin ist:

N100(5/16" CENTER CUTTING MILL) 
M6T4 
G0G80G90G54X.44Y0.S1550M3 
G43H4Z1./M8 
G98G81Z-.005R.4F3. 
X.37Y0. 
X.3Y0. 
G80M9 
G91G28Z0.M19 
G90 
M01 

ich nicht wirklich eine einfache String.IndexOf werden(), wie in diesem Code gezeigt. Ich werde Funktionen verwenden, um bestimmte Codes zu finden (zB "F" oder "G"), stellen Sie sicher, dass sie nicht in einem (Kommentar), manchmal extrahieren Sie den numerischen Wert des Codes, etc.

+0

Dies scheint wie ein idealer Job für eine regelmäßige Ausdruck. Können Sie Beispiele für die Daten und Muster, die Sie suchen, in Hex angeben? Ich denke, ich verstehe nicht ganz, was das Ganze bewirkt, aber ich bin mir ziemlich sicher, dass ich Ihnen einen besseren Weg zeigen kann, damit umzugehen. –

+0

Beispiele für die Daten wären nett. Dieser Code verwendet nicht die S-Wörterbücher, noch wissen wir, was die Daten darstellen. Ein Wörterbuch ist großartig, wenn es nur einen Eintrag für den Schlüssel geben kann. Das Finden von Sachen muss nicht mehr mit einer kleinen Linq "loopen wie verrückt" beinhalten. – Plutonix

+0

Ich entschuldige mich für meine Ignoranz. Ich weiß nicht, was Sie mit "in hex der Daten" meinen. Ich werde ein Beispiel veröffentlichen. – codingcoding

Antwort

1

Ich weiß es nicht dass Sie vor der Zeit die Dictionary erklären müssen, tun Sie?

In diesem Abschnitt:

sequence_number += 100 
If sequence_number = 100 Then 
    sequences.Add(sequence_number, S100) 
    sequences(sequence_number).Add("M6", line_number) 
End If 
' 
' If sequence_number = 5000... 
' really dude? 
' 

Sie die Eigenschaften des sequences Wörterbuch verwenden können alle wiederholten If Aussagen zu vermeiden, so etwas wie:

sequence_number += 100 

If Not sequences.ContainsKey(sequence_number) Then 
    'you have not defined the dictionary for this sequence 
    'first do that 
    sequences.Add(sequence_number, new Dictionary(Of String, Decimal)) 
End If 

'at this point you have a Dictionary for this sequence_number, so use it 
sequences(sequence_number).Add("M6", line_number) 
+0

Wörterbücher erscheinen mir sehr ungeschickt und nicht das ideale Werkzeug für eine hierarchische Datendarstellung. Es hat einen deutlichen VB6-Geruch. –

Verwandte Themen