LINQ在创建返回时是否会增加内存

Joe*_*l B 6 linq deep-copy shallow-copy

LINQ实际上是将结果的深层副本执行到不同的列表/数组/等,还是仅仅给我一个列表/数组/等.由原始参考组成?

que*_*rin 10

这将取决于您是否(以及如何)使用Select来投影结果.

如果未在投影中创建新对象,则结果将引用与原始集合相同的对象.

但是,如果您在项目中创建新对象,那么显然它们将不相同.

此处返回的集合将包含对以下相同对象的引用_myCollection:

from m in _myCollection
where m.SomeFilterCriteria
select m
Run Code Online (Sandbox Code Playgroud)

在这些情况下返回的集合不会:

from m in _myCollection
where m.SomeFilterCriteria
select new { m.Prop1, m.Prop2 }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,值得指出的是,新匿名对象的Prop1和Prop2(如果它们是引用类型)将包含对原始对象相同的对象的引用.只有集合中的顶级引用才会有所不同.

基本上 - 除了序列化程序(如本文其他地方所述)之外,.Net中的任何内容都不会"深入"复制,除非您实现它.

要么

from m in _myCollection
where m.SomeFilterCriteria
select m.Clone()
Run Code Online (Sandbox Code Playgroud)

同样,假设任何"深度"复制在这里进行是错误的.当然,Clone实现将在课堂上,可能是任何东西,包括深度复制,但没有给出.