你應該能夠使用LINQ's Concat兩個集合,然後你就可以遍歷結合:
For Each node As XmlNode In _
aDoc.SelectNodes("//*").Cast(Of XmlNode)().Concat(_
eDoc.SelectNodes("//*").Cast(Of XmlNode)())
或者,使其可讀:
Dim l_aNodes = aDoc.SelectNodes("//*").Cast(Of XmlNode)()
Dim l_eNodes = eDoc.SelectNodes("//*").Cast(Of XmlNode)()
Dim l_allNodes = l_aNodes.Concat(l_eNodes)
For Each l_node in l_allNodes
這將採取所有的來自第一個集合的元素,然後將第二個集合中的所有元素附加到它的末尾(如隊列)。
另外,如果你想 「zip」 他們,你可以使用Enumerable.Zip:
If Not l_aNodes.Count = l_eNodes.Count Then
...
End If
Dim l_allNodes =
Enumerable.Zip(
l_aNodes,
l_eNodes,
Function(a, e) New With { .aNode = a, .eNode = e })
For Each l_aeNode in l_allNodes
If Not l_aeNode.aNode.Name = l_aeNode.eNode.Name Then
...
根據對Enumerable.Zip文檔,
如果序列不具有相同的該方法會合並序列,直到達到其中一個序列的末尾。例如,如果一個序列有三個元素,另一個序列有四個,結果序列只有三個元素。
因此,您需要在開始之前比較集合的大小。這實際上是一個好主意,因爲它可以節省比較每個節點所需的處理能力。
如果集合的大小相同,則上面的代碼從每個集合中的第一個元素開始,然後將它們組合成一個Anonymous Type。然後是每個集合中的第二個元素,然後是第三個元素,結果是匿名類型實例的集合。
然後,您可以遍歷匿名類型實例並使用適當的屬性(aNode
和eNode
)獲取每個元素。
但是有沒有一些內置的語法來處理?不,那裏沒有。
來源
2013-12-18 21:39:29
JDB
廣東話你窩呢?類似於'blah'中的每個項目,然後'blah2中的每個項目''next'' next' – logixologist
@logixologist - 我認爲OP想要一個扁平列表,但是它會遍歷整個內部列表*外部列表。 – JDB
@JDB,他很難清楚他想要做什麼。你可能是對的。 – logixologist