如果我从XDocument中创建了一个XElements列表,那么它就是在内存中创建的元素列表的新副本

本文关键字:创建 列表 内存 副本 新副本 元素 XDocument 一个 如果 XElements | 更新日期: 2023-09-27 18:26:40

如果我有一个从XDocument.Load加载到内存中的XDocument,然后我对它进行LINQ-XML查询,例如:

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

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

如果我真的通过调用.ToList()来枚举它呢?

如果我从XDocument中创建了一个XElements列表,那么它就是在内存中创建的元素列表的新副本

XDocument.Load将把整个数据集读入内存。

对数据的查询将返回对现有元素的引用。例如,检查GetElement的引用源,它直接(通过引用)将现有节点yield发送给调用者。

查询文档时生成的主要额外内存是实现迭代器本身所需的内存,与文档大小相比,这应该非常小。

只是一个引用。

您必须使用new运算符将内存分配给堆上的新List<XElement>

第二行返回的IEnumerable的内存中是否有副本?或者它只是原始XDocument 的参考副本

正如其他人指出的那样,是后者。

如果您确实想要元素的深度克隆,您可以使用XElement复制构造函数:

var ordersCopy = doc.Root.Element("Envelope").Elements("Order").Select(element => new XElement(element);