【发布时间】:2011-08-05 22:02:09
【问题描述】:
我正在从“XStreamingReader”库中读取一段代码(这似乎是一个非常酷的解决方案,能够对 XML 文档执行 LINQ 查询,但无需将实际文档加载到内存中(如在 XDocument 对象中) 并且想知道以下几点:
public IEnumerable<XElement> Elements()
{
using (var reader = readerFactory())
{
reader.MoveToContent();
MoveToNextElement(reader);
while (!reader.EOF)
{
yield return XElement.Load(reader.ReadSubtree());
MoveToNextFollowing(reader);
}
}
}
public IEnumerable<XElement> Elements(XName name)
{
return Elements().Where(x => x.Name == name);
}
关于第二个方法Elements(XName) - 该方法首先调用 Elements(),然后使用 Where() 过滤它的结果,但我对这里的执行顺序有点感兴趣,因为 Elements() 包含产量声明。
据我了解:
- 执行 Elements() 返回一个 IEnumerable 集合,该集合实际上不包含任何项目。
- Where() 在该集合上执行,在场景后面有一个循环遍历每个项目,新项目是动态“加载”的,因为正在使用产量。
- 与 Where 语句匹配的所有项目都作为 IEnumerable 集合返回,并且物理上位于该集合中。
首先,我对上述假设是否正确? 其次,如果我是对的——如果我想返回一个“生成的”集合,而不是返回一个物理上填满所有过滤数据的集合,该怎么办? 我问这个是因为它失去了不将整个“匹配”块读入内存的全部目的,而是一次迭代一个匹配元素......
【问题讨论】:
-
您有两个问题,它们并不真正相关。我认为您实际上应该问两个单独的问题。您可以从这篇文章中删除其中一个并为另一个创建一个新的。
标签: c# linq linq-to-xml yield