【发布时间】:2016-12-21 14:23:35
【问题描述】:
我有一段代码遍历 XmlNodeList 中的节点,并根据节点名称为每个节点创建不同的对象,并将其添加到列表中以供打印。
For Each node as XmlNode In nodeList
Select Case node.Name.ToUpper()
Case "SHAPE"
_items.Add(New ShapeTemplate(node, Me))
Case "TEXTBLOCK"
_items.Add(New TextblockTemplate(node, Me))
End Select
Next
此代码运行良好,但由于 ShapeTemplate 和 TextblockTemplate 构造函数必须完成所有工作,因此速度非常慢。由于订单对象添加到 _items 并不重要,我认为加快它的好方法是使用 parallel.ForEach 循环。问题是 XmlNodeList 不能与 parallel.ForEach 一起使用,因为它是一个非泛型集合。我一直在寻找将 XmlNodeList 转换为 List(Of XmlNode) 的方法,但没有成功。我不断看到的答案是
Dim nodes as New List(Of xmlNode)(nodeList.Cast(Of xmlNode)())
但是当我尝试它时,我收到一条错误消息,告诉我“Cast”不是 XmlNodeList 的成员。
我也尝试过像这样使用 TryCast
Dim nodes as List(Of XmlNode) = TryCast(CObj(nodeList), List(Of XmlNode))
但它会导致节点为 Nothing,因为无法转换对象。
有人知道我如何在 parallel.ForEach 循环中使用 XmlNodeList 吗?
编辑:如果可以的话,我会尽量避免使用循环进行转换
【问题讨论】:
-
你问如何在循环中做,然后说你想避免使用循环?为什么?
-
在创建 ShapeTemplate 和 TextblockTemplate 时尝试使用线程。这不应该阻止循环。
-
您是否有对 System.Core.dll 的引用和对 System.Linq 的导入,以便您选择
Enumerable.Cast?此外,[PLINQ] 可能比Parallel.ForEach更适合。 -
Daniel,我想使用 parallel.ForEach 循环代替问题中包含的循环,但我不想循环 XmlNodeList 以将其转换为可用格式在进入parallel.ForEach循环之前
-
马克,你能指导我去哪里看看如何使用 PLINQ 而不是 Parallel.ForEach 吗?我确实有你提到的要求
标签: vb.net foreach casting parallel-processing xmlnodelist