如果我从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.Load
将把整个数据集读入内存。
对数据的查询将返回对现有元素的引用。例如,检查GetElement的引用源,它直接(通过引用)将现有节点yield
发送给调用者。
查询文档时生成的主要额外内存是实现迭代器本身所需的内存,与文档大小相比,这应该非常小。
只是一个引用。
您必须使用new
运算符将内存分配给堆上的新List<XElement>
。
第二行返回的IEnumerable的内存中是否有副本?或者它只是原始XDocument 的参考副本
正如其他人指出的那样,是后者。
如果您确实想要元素的深度克隆,您可以使用XElement
复制构造函数:
var ordersCopy = doc.Root.Element("Envelope").Elements("Order").Select(element => new XElement(element);