0

Enumerable.Select() メソッドを使用して、既存のリストから新しい IEnumerable リストを作成しています。コード例は次のとおりです。

class ClassA
{
   IEnumerable<TypeA> List1;
   ....
}

class ClassB
{
   IEnumerable<TypeB> List2;
   ...
}

class TypeA
{
    //some properties;
    IEnumerable<TypeC> Prop3;
}

class TypeB
{ 
   //some properties;
   IEnumerable<TypeC> Property3;
}

.
.
.
.

ClassA input;  //input data object
ClassB result = new classB();
result.List2 = input.List1.Select(s =>
{
   new TypeB() 
   {
       Property1 = s.Prop1,
       Property2 = s.Prop2,
       Property3 = s.Prop3==null?null:s.Prop3.Select(c=>c)
   }
});

上記の例では、List2 は List1 のディープ コピーですか、それともシャロー コピーですか? そうでない場合、ディープコピーを取得するにはどうすればよいですか?

また、上記のコードが実行された後 (結果オブジェクトが作成された後) に Prop3 = null を設定すると、result.Property3 も null になります。誰かがなぜこれが起こっているのか説明できますか?

4

2 に答える 2

2

Select() の呼び出しによって、実際には s.Prop3 が使用された時点で列挙されるわけではなく、後で Property3 にアクセスしたときに s.Prop3 が列挙されるように、s.Prop3 のビューのように考えることができます。その時点で Prop3。

Property3 に割り当てるときに s.Prop3 の内容をコピーする場合は、次を使用します。

 s.Prop3.ToList() 

...代わりは。これにより、s.Prop3 が要素ごとに新しいリストにコピーされます。つまり、s.Prop3 が後で変更されても、Property3 には影響しません。

于 2013-07-10T15:08:18.427 に答える
1

上記の例では、List2 は List1 のディープ コピーですか、それともシャロー コピーですか?

IEnumerable が列挙されていないため、技術的にはどちらもありません。これは値にも適用さProperty3れます。列挙されると、ディープ コピーのように見えます。

上記のコードが実行された後 (結果オブジェクトが作成された後)、Prop3 = null を設定すると、result.Property3 も null になります。

これは、result.List2Prop3 = null を設定した後に列挙している可能性が高いためです。Select これは完全に、実際に何が行われるかについての明らかな誤解に基づいています。行の実行時に新しいコレクションToListを作成するのではなく、ToArrayforeach(var x in y)、 などが呼び出されたとき (つまり、列挙されるたびに)のようなコレクションを作成する方法についての指示です。 )。

于 2013-07-10T15:17:16.057 に答える