现在我不确定这里的问题是什么,但似乎每次迭代都会重新评估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()
方法,但之后我不得不稍微更改一些其他代码。这不是一个真正的问题,我只是希望它能像这样工作,也能理解这里发生了什么。
答案 0 :(得分:3)
在那些不是问题的情况下,这是迄今为止最好的方式。
在出现问题的情况下,请使用toList()或类似的来获取。
中间地带是构建一个可枚举的数据,该数据通过结果进行立即处理,但也保留了后续工作的列表。如果第一次传递可能导致下一次操作被放弃为不必要的话,这可能特别有用。