Linq重新评估的问题,跳过内容

时间:2010-08-16 11:53:09

标签: c# linq foreach openxml

现在我不确定这里的问题是什么,但似乎每次迭代都会重新评估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()方法,但之后我不得不稍微更改一些其他代码。这不是一个真正的问题,我只是希望它能像这样工作,也能理解这里发生了什么。

1 个答案:

答案 0 :(得分:3)

每次使用都会重新评估LINQ查询,因为这样可以使内存最少(通常是O(1)内存使用)并快速返回第一个结果。

在那些不是问题的情况下,这是迄今为止最好的方式。

在出现问题的情况下,请使用toList()或类似的来获取。

中间地带是构建一个可枚举的数据,该数据通过结果进行立即处理,但也保留了后续工作的列表。如果第一次传递可能导致下一次操作被放弃为不必要的话,这可能特别有用。