LINQ は実際に結果のディープ コピーを別のリスト/配列/etc に実行しますか、それとも単純にリスト/配列/etc を提供しますか? オリジナルへの参照で構成されていますか?
3 に答える
Select を使用して結果を投影するかどうか (およびその方法) によって異なります。
プロジェクションで新しいオブジェクトを作成しない場合、結果は元のコレクションと同じオブジェクトを参照します。
ただし、プロジェクトで新しいオブジェクトを作成すると、明らかに同じではありません。
ここで返されるコレクションには、 内の同じオブジェクトへの参照が含まれます_myCollection
。
from m in _myCollection
where m.SomeFilterCriteria
select m
これらの場合に返されるコレクションは、次のことを行いません。
from m in _myCollection
where m.SomeFilterCriteria
select new { m.Prop1, m.Prop2 }
この場合、新しい匿名オブジェクトの Prop1 と Prop2 (それらが参照型の場合) には、元のオブジェクトと同じオブジェクトへの参照が含まれることに注意してください。コレクション内の最上位の参照のみが異なります。
基本的に、実装しない限り、(ここの他の場所で説明されているように) シリアライザー以外の .Net には「ディープ」コピーはありません。
また
from m in _myCollection
where m.SomeFilterCriteria
select m.Clone()
繰り返しますが、ここで「深い」コピーが行われていると仮定するのは間違いです。もちろん、Clone
の実装はクラスにあり、ディープ コピーを含めて何でもかまいませんが、それは指定されていません。
LINQ は実際に結果のディープ コピーを別のリスト/配列/etc に実行しますか、それとも単純にリスト/配列/etc を提供しますか? オリジナルへの参照で構成されていますか?
Enumerable.ToArrayから。( Enumerable.ToListで見つかった同様のテキスト)
ToArray(IEnumerable) メソッドは、即時のクエリ評価を強制し、クエリ結果を含む配列を返します。クエリ結果のキャッシュされたコピーを取得するために、このメソッドをクエリに追加できます。
うーん、確かに紛らわしいですね。
- クエリ結果を含む配列を返します
- クエリ結果のキャッシュされたコピーを取得する
最初の文から、クエリ内のアイテムのコピーが作成されないことは明らかです。
2 番目の文から、クエリ結果全体のコピーを取得しますが、クエリ内の項目のコピーが作成されないため、これは浅いコピーです。
返される内容は、参照している LINQ メソッドに大きく依存します。ただし、列挙を明示的にコピーするいくつかのメソッド (ToList
およびToArray
たとえば) を除いて、一般的なパターンは、入力を新しい構造体にコピーしないことです。代わりに、遅延評価を優先します。