C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■93542 / 1階層)  List<T>の結果処理について
□投稿者/ 魔界の仮面弁士 (2534回)-(2019/12/20(Fri) 10:58:15)
No93537 (ピカチュウ さん) に返信
> var getResult=〇〇//SQLで取ったList<class>のリスト。今回は4つのリストが入ってます

提示頂いたコードは、文法違反のエラーになりそうですね。

class という名前のクラスは作れませんし、メソッドについても
RemoveAt はあっても removeat はありませんので。


> どうしてこんな現象が起きるのでしょうか?

List<int> x = new List<int> { 10, 20, 30, 40 };
List<int> y = x;
List<int> z = x;
z.RemoveAt(0);

たとえば上記の場合、インスタンスは new List<int> ひとつだけです。
x や y や z が参照しているインスタンスは、同じものとなります。

そして RemoveAt は「インスタンス メソッド」です。

ひとつしか無いインスタンスを操作しているわけですから、
x、y、z いずれから見た場合も、その中身は
{ 10, 20, 30, 40 } から { 20, 30, 40 } に変化するというわけです。


もしもデータの複製が「シャローコピー」で構わない場合は、ToList を使う方法があります。

List<int> x = new List<int> { 10, 20, 30, 40 };
List<int> y = x.ToList();
List<int> z = x.ToList();
x[2] = 123;
y.RemoveAt(1);
z.RemoveAt(0);


.ToList() によって新しいインスタンスが生成されますので、
x、y、z が参照しているオブジェクトは、それぞれ別物となります。

x の中身は { 10, 20, 123, 40 } で、
y の中身は { 10, 30, 40 } で
z の中身は { 20, 30, 40 } ですね。



ただし「ディープコピー」が必要な場合は、ToList だけでは不足です。

List<int[]> x = new List<int[]> { new int[] { 10, 20 }, new int[] { 30, 40 } };
List<int[]> y = x.ToList();
List<int[]> z = x.ToList();
x[1][0] = 111;
y[0][0] = 222;
z[1] = new int[] { 123, 456 };

上記を実行すると、
x の中身は { { 222, 20 }, { 111, 40 } }
y の中身も { { 222, 20 }, { 111, 40 } }
z の中身は { { 222, 20 }, { 123, 456 } }
となります。

x,y,z はそれぞれ別のインスタンスですが、
x[0], y[0], z[0] が参照している配列は同一のインスタンスだからです。



上記を、kiku さんが紹介されていた記事にある DeepClone の実装に置き換えてみます。

List<int[]> x = new List<int[]> { new int[] { 10, 20 }, new int[] { 30, 40 } };
List<int[]> y = x.DeepClone();
List<int[]> z = x.DeepClone();
x[1][0] = 111;
y[0][0] = 222;
z[1] = new int[] { 123, 456 };

この場合、上記を実行した結果が
x の中身は { { 10, 20 }, { 111, 40 } }
y の中身も { { 222, 20 }, { 30, 40 } }
z の中身は { { 10, 20 }, { 123, 456 } }
となりますので、求めるものに近いのではないでしょうか?

なお、DeepClone メソッド内では Serialize / Deserialize メソッドが
利用されていますので、これが使えるのは、List<T> の T 型が
シリアル化可能な型である場合に限られます。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←List<T>の結果処理について /ピカチュウ 返信無し
 
上記関連ツリー

List<T>の結果処理について / ピカチュウ (19/12/19(Thu) 23:38) #93537
Re[1]: List<T>の結果処理について / sima (19/12/20(Fri) 06:48) #93539
Re[1]: List<T>の結果処理について / キングダム (19/12/20(Fri) 06:32) #93538
Re[1]: List<T>の結果処理について / kiku (19/12/20(Fri) 09:30) #93540
List<T>の結果処理について / 魔界の仮面弁士 (19/12/20(Fri) 10:58) #93542 ←Now

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信