如果我从XDocument创建一个XElements列表,是否是在内存中创建的元素列表的新副本?

时间:2014-10-14 22:12:57

标签: c# xml linq memory-management linq-to-xml

如果我在XDocument的内存中加载XDocument.Load,然后在其上执行LINQ-XML查询,例如:

XDocument doc = XDocument.Load(@"C:/doc.xml");
var orders = doc.Root.Element("Envelope").Elements("Order");

是否有第二行返回的IEnumerable<XElement>的内存副本?或者它只是原始XDocument

的参考副本

如果我通过调用.ToList()实际枚举它,那该怎么办?

3 个答案:

答案 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);