2016-09-09 6 views
-2

Ich habe zwei gleich große Listen von XElements:Wie zwei XElement-Enumerables zu vergleichen?

var documentDatabase = XDocument.Parse(xmlDatabase); 
var rootElementDatabase = documentDatabase.Root; 
var segmentsDatabase = rootElementDatabase.Descendants("Segment"); 

var documentSlave = XDocument.Parse(xmlSlave); 
var rootElementSlave = documentSlave.Root; 
var segmentsSlave = rootElementSlave.Descendants("Segment"); 

Grundsätzlich Liste der Segmentelemente, wie unten:

 <Segment> 
      <IdRef>1</IdRef> 
      <Start> 
       <Master>0</Master> 
       <Slave>0</Slave> 
       <PntType>4</PntType> 
      </Start> 
      <End> 
       <Master>10.059000</Master> 
       <Slave>29.450302</Slave> 
       <PntType>4</PntType> 
      </End> 
      <Symmetry>0.5</Symmetry> 
      <FunctionType>1</FunctionType> 
     </Segment> 

Was ich will, ist zu vergleichen, ob sie gleich von Werten in <Master> und <Slave> Vergleich Tags, den Rest ignorierend. Wie kann ich es erreichen?

+0

mit Getestet vergleichen Wollen Sie segmentsDatabase vergleichen [i] mit segmentsSlave [i] oder möchte segmentsDatabase [i] mit allen segmentsegmentenSlave vergleichen? – Mehmet

+0

SegmenteDatenbank [i] mit SegmentenSlave [i] – Pablo

+0

Start, Ende oder beides? – dbasnett

Antwort

0

Wenn Sie die Master- und Slave-Tags sowohl der Beginn und das Ende vergleichen wollen, können Sie diese Methode verwenden:

bool CompareXmls(XElement first, XElement second) 
{ 
     var firstStart = first.Element("Start"); 
     var firstEnd = first.Element("End"); 
     var firstStartMaster = firstStart.Element("Master").Value; 
     var firstStartSlave = firstStart.Element("Slave").Value; 
     var firstEndMaster = firstEnd.Element("Master").Value; 
     var firstEndSlave = firstEnd.Element("Slave").Value; 

     var secondStart = second.Element("Start"); 
     var secondEnd = second.Element("End"); 
     var secondStartMaster = secondStart.Element("Master").Value; 
     var secondStartSlave = secondStart.Element("Slave").Value; 
     var secondEndMaster = secondEnd.Element("Master").Value; 
     var secondEndSlave = secondEnd.Element("Slave").Value; 

     bool areEqual = firstStartMaster == secondStartMaster 
      && firstStartSlave == secondStartSlave 
      && firstEndMaster == secondEndMaster 
      && firstEndSlave == secondEndSlave; 

     return areEqual; 
    } 

EDIT: Wanting Listen zu vergleichen, die bereits sortiert sind, und Sie können zuerst vergleichen Element aus einer Liste mit dem ersten Element aus anderen Liste und so weiter, können Sie LINQ .Zip Methode zur Gruppe der XElements in ein anonymes Objekt verwenden und dann LINQ .Alle Zyklus durch die Elemente und vergleichen Sie:

var res = firstList.Zip(secondList, (a, b) => new { First = a, Second = b }).All(x=>CompareXmls(x.First,x.Second)); 

persönlich , Würde ich wahrscheinlich eine for-Schleife verwenden, um zu iterieren In den beiden Listen vergleichen Sie die einzelnen Elemente. Wenn Sie jedoch einen einzeiligen LINQ verwenden möchten, können Sie die genannten Methoden verwenden.

+0

Ich habe zwei * Listen * von XElements. – Pablo

+0

Ich schätze, die Listen sind nicht geordnet? – vmutafov

+0

Sie equaly zu bestellen angenommen werden, so brauche ich nur Element 0 in einer Liste zu Element 0 in anderen zu vergleichen, etc .. Ich dachte, es könnte eine Möglichkeit Einbeziehung LINQ sein, die mir Elemente aus jeder Liste geben wird, dann könnte ich Vergleichen Sie mit '.Element (...)'. – Pablo

1

Wenn Sie eine Methode mehrere Segmente haben schaffen sie

Private Function ChkSeg(segment As XElement) As Boolean 
    If segment.<Start>.<Master>.Value = segment.<End>.<Master>.Value AndAlso 
     segment.<Start>.<Slave>.Value = segment.<End>.<Slave>.Value Then 
     Return True 
    Else 
     Return False 
    End If 
End Function 

dann iterieren die XML-ähnliche

For Each el As XElement In xe.Elements 
     If ChkSeg(el) Then 
      Stop 
     Else 
      Stop 
     End If 
    Next 

dieses

Dim xe As XElement 

    xe = <segments> 
      <Segment> 
       <IdRef>1</IdRef> 
       <Start> 
        <Master>0</Master> 
        <Slave>0</Slave> 
        <PntType>4</PntType> 
       </Start> 
       <End> 
        <Master>10.059000</Master> 
        <Slave>29.450302</Slave> 
        <PntType>4</PntType> 
       </End> 
       <Symmetry>0.5</Symmetry> 
       <FunctionType>1</FunctionType> 
      </Segment> 
      <Segment> 
       <IdRef>1</IdRef> 
       <Start> 
        <Master>0</Master> 
        <Slave>0</Slave> 
        <PntType>4</PntType> 
       </Start> 
       <End> 
        <Master>0</Master> 
        <Slave>0</Slave> 
        <PntType>4</PntType> 
       </End> 
       <Symmetry>0.5</Symmetry> 
       <FunctionType>1</FunctionType> 
      </Segment> 
     </segments>