[英]How to compare two XElement enumerables?
我有兩個相同大小的 XElements 列表:
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 元素列表,如下所示:
<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>
標簽中的值來比較它們是否相等,忽略其余部分。 我怎樣才能實現它?
如果您有多個細分,請創建一個方法來比較它們
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
然后像這樣迭代 XML
For Each el As XElement In xe.Elements
If ChkSeg(el) Then
Stop
Else
Stop
End If
Next
使用此測試
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>
如果要比較Start和End中的Master和Slave標簽,可以使用這種方法:
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;
}
編輯:想要比較已經排序的列表,並且您可以將一個列表中的第一個項目與另一個列表中的第一個項目進行比較,依此類推,您可以使用 LINQ .Zip 方法將 XElements 分組為一個匿名對象,然后使用 LINQ .All循環遍歷項目並比較:
var res = firstList.Zip(secondList, (a, b) => new { First = a, Second = b }).All(x=>CompareXmls(x.First,x.Second));
就個人而言,我可能會使用 for 循環來遍歷兩個列表並比較每個項目,但如果您想使用單行 LINQ,則可以使用上述方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.