2016-09-09 20 views
-2

私はXElementsの二つの等しいサイズのリストを持っている:2つのXElementの列挙型を比較す​​るには?

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"); 

基本的には、セグメント要素は、以下のようなリスト:

 <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> 

私がしたいことは<Master><Slave>内の値を比較することによって、それらが等しいかどうかを比較することです残りの部分は無視します。どうすれば達成できますか?あなたが開始と終了の両方でマスターとスレーブタグを比較したい場合は

+0

を使用してテストこの

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

のようなXMLを繰り返すあなたがsegmentsDatabaseを比較したいですか[i]をsegmentsSlave [i]とするか、またはsegmentsDatabase [i]とsegmentsSlaveのすべてのセグメントを比較したいですか? – Mehmet

+0

segmentsDlabase [i] with segmentsSlave [i] – Pablo

+0

開始、終了、またはその両方? – dbasnett

答えて

0

、あなたは、このメソッドを使用することができます。

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:すでにソートされているリストを比較したくて、あなたが最初に比較することができますその上、他のリストの最初の項目に1つのリストから項目と、あなたは1つの匿名オブジェクトにグループにXElementsをLINQ .ZIPメソッドを使用して、アイテムをLINQ。すべてのサイクルを使用して比較することができます:

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

、おそらくforループを使ってovを繰り返します2つのリストを比較して各アイテムを比較しますが、1つのライナーのLINQを使用する場合は、上記の方法を使用できます。

+0

私はXElementsの2つの*リスト*を持っています。 – Pablo

+0

リストは注文されていないと思いますか? – vmutafov

+0

これらはequalityの順序であると仮定されているので、あるリストの要素0と他の要素の要素0を比較する必要があります。LINQを含む方法があると思っていました。 '.Element(...) 'を使って比較してください。 – Pablo

1

あなたは複数のセグメントは彼らに

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 

を比較するメソッドを作成している場合、この

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> 
関連する問題