我有以下 XML。
<Parts>
<Part name="Part1" disabled="true"></Part>
<Part name="Part2" disabled="false"></Part>
<Part name="Part3" ></Part>
<Part name="Part4" disabled="true"></Part>
</Parts>
我想删除disabled
属性设置为的节点true
。如果 'disabled' 属性没有用于任何 'Part' 元素,则意味着它没有被禁用。
我写了以下代码:
XmlNode root = xmlDoc.DocumentElement;
List<XmlNode> disabledNodes = new List<XmlNode>();
foreach(XmlNode node in root.ChildNodes)
{
if(node.Attributes["disabled"] != null &&
Convert.ToBoolean(node.Attributes["disabled"].Value))
{
disabledNodes.Add(node);
}
}
foreach (XmlNode node in disabledNodes)
{
root .RemoveChild(node);
}
此代码按预期从 XML 中删除 2 个节点。
然后我编写了以下代码以使代码紧凑:
foreach (XmlNode node in root.ChildNodes.Cast<XmlNode>()
.Where(child => child.Attributes["disabled"] != null &&
Convert.ToBoolean(child.Attributes["disabled"].Value)))
{
root.RemoveChild(node); // This line works fine without any exception.
}
我发现这个循环只迭代一次,只从 XML 中删除一个节点。
编辑问题:
现在,当我更改foreach
循环时,这次我将 LINQ 表达式的结果转换为List<T>
usingToList()
方法(正如@Toni Petrina 在他的回答中所建议的那样)。这次它工作正常!
foreach (XmlNode node in root.ChildNodes.Cast<XmlNode>()
.Where(child => child.Attributes["disabled"] != null &&
Convert.ToBoolean(child.Attributes["disabled"].Value)).ToList())
{
root.RemoveChild(node); // This line works fine without any exception.
}
为什么使用ToList()
made LINQ表达式foreach
按预期循环工作?为什么 LINQ 的结果在两种不同情况下表现不同的任何技术原因?
我正在使用 .NET 4.0。