如果我在XDocument
的内存中加载XDocument.Load
,然后在其上执行LINQ-XML查询,例如:
XDocument doc = XDocument.Load(@"C:/doc.xml");
var orders = doc.Root.Element("Envelope").Elements("Order");
是否有第二行返回的IEnumerable<XElement>
的内存副本?或者它只是原始XDocument
如果我通过调用.ToList()
实际枚举它,那该怎么办?
答案 0 :(得分:4)
XDocument.Load
会将整个数据集读入内存。
对数据的查询将返回对现有元素的引用。例如,检查GetElement的参考源,将yield
现有节点直接发送给调用者(通过引用)。
在查询文档时生成的主要附加内存将是实现迭代器本身所需的内存,与文档大小相比,它应该非常小。
答案 1 :(得分:0)
仅供参考。
您必须使用new
运算符将内存分配给堆上的新List<XElement>
。
答案 2 :(得分:0)
第二行返回的IEnumerable是否有内存副本?或者它只是原始XDocument的参考副本
正如其他人指出的那样,它是后者。
如果您确实需要元素的深度克隆,可以使用XElement
copy constructor:
var ordersCopy = doc.Root.Element("Envelope").Elements("Order").Select(element => new XElement(element);