2017-07-19 4 views
3

Ich habe 3 für jede Aussagen, die durch Gesetze in XML-Dokument (aobjXMLCaseDoc) und dann zu überprüfen, werden Looping, wenn diese Statuten 260C.405 folgende Statuten entsprechen, 518,131, 518B.01, 609,748, 629,75Wie kombiniere ich 3 for loop?

Ich möchte diese 3 für jede in einer für jede Aussage kombinieren. Wie mache ich das?

XML

<?xml version="1.0" encoding="UTF-8"?> 
<Charge> 
    <ChargeHistory ChargeHistoryID="387"> 
     <Statute> 
      <StatuteNumber>609.352.2a(2)</StatuteNumber> 
     </Statute> 
    </ChargeHistory> 
    <ChargeHistory ChargeHistoryID="398"> 
     <Statute> 
      <StatuteNumber>609.352.2a(2)</StatuteNumber> 
     </Statute> 
    </ChargeHistory> 
    <ChargeHistory ChargeHistoryID="517"> 
     <Statute> 
      <StatuteNumber>609.352.2a(2)</StatuteNumber> 
     </Statute> 
    </ChargeHistory> 
    <Deleted>false</Deleted> 
</Charge> 

VB Code

'Check if statute has 8 characters 
    For Each objXMLStatuteNode In aobjXMLCaseDoc.DocumentElement.SelectNodes("Case/Charge/ChargeHistory/Statute/StatuteNumber") 
     If objXMLStatuteNode.InnerText.Length >= 8 Then 
      strStatuteEightDigits = objXMLStatuteNode.InnerText.Substring(0, 8) 
      Select Case strStatuteEightDigits 
       Case "260C.405" 
        blnNotSpecifiedStatute = False 
       Case Else 
        blnNotSpecifiedStatute = True 
      End Select 
     End If 
    Next 

    'Check if statute has 7 characters 
    For Each objXMLStatuteNode In aobjXMLCaseDoc.DocumentElement.SelectNodes("Case/Charge/ChargeHistory/Statute/StatuteNumber") 
     If objXMLStatuteNode.InnerText.Length >= 7 Then 
      strStatuteSevenDigits = objXMLStatuteNode.InnerText.Substring(0, 7) 
      Select Case strStatuteSevenDigits 
       Case "518.131", "518B.01", "609.748" 
        blnNotSpecifiedStatute = False 
       Case Else 
        blnNotSpecifiedStatute = True 
      End Select 
     End If 
    Next 

    'Check if statute has 6 characters 
    For Each objXMLStatuteNode In aobjXMLCaseDoc.DocumentElement.SelectNodes("Case/Charge/ChargeHistory/Statute/StatuteNumber") 
     If objXMLStatuteNode.InnerText.Length >= 6 Then 
      strStatuteSixDigits = objXMLStatuteNode.InnerText.Substring(0, 6) 
      Select Case strStatuteSixDigits 
       Case "629.75" 
        blnNotSpecifiedStatute = False 
       Case Else 
        blnNotSpecifiedStatute = True 
      End Select 
     End If 
    Next 
+0

Ich glaube nicht einmal, das funktioniert wie da ganz der Wert blnNotSpecifiedStatute auf der letzten Prüfung abhängt. –

+0

Deshalb habe ich um Hilfe gebeten. –

Antwort

2

Alle Code scheint überprüft zu tun, um zu sehen, ob einer der Satzung Zahlen mit einem der fünf Saiten beginnen („260C.405“, „518,131 "," 518B.01 "," 609.748 "," 629.75 "). Sie können dazu StartsWith verwenden.

Sie können Any verwenden, um zu überprüfen, ob eine der Statutennummern einen Test erfüllt, und dieser Test kann auch Any verwenden, um zu sehen, ob die Statutennummer mit einer Liste von Strings beginnt. Das Ganze kann in einer einzigen Aussage geschehen.

Die von Ihnen angegebene XML-Beispieldatei beginnt mit <Charge>, aber Ihr Code scheint davon auszugehen, dass die <Charge> Elemente in einem <Case> Element vorhanden sind. Um konsistent zu sein, habe ich <Case> aus dem Code entfernt. Sie müssen es (unmittelbar vor <Charge>) zurückstellen, wenn es benötigt wird.

Beachten Sie, dass Ihr Code (und meine unten) nach einer beliebigen Statutennummer sucht, die mit "629.75" beginnt, also würde "629.751" als Übereinstimmung betrachtet werden. Es ist möglich, dass Sie nach Statuten suchen, die mit "629.75" beginnen. statt „629,75“

Private statutes As New List(Of String) From {"260C.405", "518.131", "518B.01", "609.748", "629.75"} 
Private objXML As XDocument = <?xml version="1.0" encoding="UTF-8"?> 
           <Charge> 
            <ChargeHistory ChargeHistoryID="387"> 
             <Statute> 
              <StatuteNumber>609.352.2a(2)</StatuteNumber> 
             </Statute> 
            </ChargeHistory> 
            <ChargeHistory ChargeHistoryID="398"> 
             <Statute> 
              <StatuteNumber>609.352.2a(2)</StatuteNumber> 
             </Statute> 
            </ChargeHistory> 
            <ChargeHistory ChargeHistoryID="517"> 
             <Statute> 
              <StatuteNumber>609.352.2a(2)</StatuteNumber> 
             </Statute> 
            </ChargeHistory> 
            <Deleted>false</Deleted> 
           </Charge> 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim blnNotSpecifiedStatute As Boolean 
    blnNotSpecifiedStatute = Not objXML.<Charge>.<ChargeHistory>.<Statute>.<StatuteNumber>.Any(Function(n) statutes.Any(Function(s) n.Value.StartsWith(s))) 
    'Do something with blnNotSpecifiedStatute 
End Sub 
+0

Bedeutet das, dass ich nicht die Case/Charge/ChargeHistory/Statute/StatuteNumber durchlaufen muss, um die Statutennummer zu finden? Was ich versuche zu tun ist, verwenden Sie das XML-Dokument und schauen Sie die Satzung, um zu sehen, ob irgendwelche in XML-Dokument diese Satzung 260C.405, 518.131, 518B.01, 609.748, 629.75 übereinstimmen. Wenn irgendwelche Übereinstimmungen vorhanden sind, dann möchte ich bnnNotSpecifiedStatute auf False setzen, wenn no übereinstimmt, wird blnNotSpecifiedStatute auf true gesetzt. –

+0

Der Code in meiner Antwort bewirkt, dass eine Schleife ausgeführt wird, sie tut es einfach in einer Anweisung. 'objXML. . . . .Any (Funktion (n) .....) 'verarbeitet jedes -Element. Das -Element wird zum 'n' in' Function (n) '. – Blackwood

+0

Ich habe einige Änderungen an Ihrem Beispiel vorgenommen und nun funktioniert mein Code. Da ich keine Punkte verlieren möchte, werde ich meinen Code hier nicht hinzufügen. Ich riskiere verboten zu werden! –

1

Verwendung Wenn-ElseIf:

For Each objXMLStatuteNode In aobjXMLCaseDoc.DocumentElement.... 

    If objXMLStatuteNode.InnerText.Length >= 8 Then 
     ''' Checks for 8 or more chars 
     ....      
    ElseIf objXMLStatuteNode.InnerText.Length = 7 Then 
     ''' Checks for 7 Chars 
     .... 
    ElseIf objXMLStatuteNode.InnerText.Length = 6 Then 
     ''' Checks for 6 chars 
     .... 
    Else 
     ''' For Less than 6 chars 
    End If 

Next 

Auch ich denke, Sie Logik ein bisschen zwicken, weil 8 benötigen ist> = 8, aber es ist auch> = 7 und ist auch> = 6.