【发布时间】:2010-08-16 11:53:09
【问题描述】:
现在我不确定这里的问题是什么,但似乎每次迭代都会重新评估 Linq 查询,这是我想要的效果。但是由于某种原因,他跳过了他不应该这样做的元素。
谁能帮我理解这里发生了什么。这是 Linq-to-XML 代码:
var contents = (from sdt in document.MainDocumentPart.RootElement.Descendants<SdtElement>()
select sdt);
foreach (SdtElement item in contents)
{
ReplaceContent(item, data);
}
ReplaceContent 方法将SdtElement 的一部分取出并放置它而不是那个元素。下一次迭代内容与预期的一样少了 1 个元素。但是,当我用 2 个 SdtElements 击中一个段落(因此同一父级下的 2 个元素)并且在他替换第一个段落之后,他不包括第二个段落并跳过它。但它仍在文档中。
这是ReplaceContent方法的一部分:
public void ReplaceContent(SdtElement contentControl, XElement xml)
{
OpenXmlElement content = null;
if (contentControl is SdtRun)
{
content = (contentControl as SdtRun).SdtContentRun.GetFirstChild<Run>();
//Items cut for brevity
}
//Items cut for brevity
if (content != null)
{
content.Remove();
var parent = contentControl.Parent;
parent.ReplaceChild(content, contentControl);
}
}
我可以在 Linq 上使用ToList() 方法,但是我不得不稍微更改一些其他代码。这不是一个真正的问题,我只是希望它像这样工作,并了解这里发生了什么。
【问题讨论】: