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

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

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

List に配列を入れたときRemoveができない

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■84560 / inTopicNo.1)  List に配列を入れたときRemoveができない
  
□投稿者/ さお (1回)-(2017/07/15(Sat) 18:34:56)

分類:[C#] 

2017/07/15(Sat) 18:35:48 編集(投稿者)
2017/07/15(Sat) 18:35:35 編集(投稿者)

List<int[]> l_i = new List<int[]>();

l_i.Add(new int[] { 0, 0 } );
l_i.Add(new int[] { 0, 1 } );
l_i.Add(new int[] { 0, 2 } );
l_i.Add(new int[] { 0, 3 } );

l_i.Remove(new int[] { 0, 0 } );

とやっても削除できません。

ちなみに
if (l_i[0] == new int[] { 0, 0 })
{
     MessageBox.Show("真");
}
else
{
     MessageBox.Show("偽");
}

と確認してみたら「偽」になってしまいました。
ご見識がおありの方がいらしゃいましたら
よろしくお願いいたします。
引用返信 編集キー/
■84562 / inTopicNo.2)  Re[1]: List に配列を入れたときRemoveができない
□投稿者/ ぽぴ王子 (48回)-(2017/07/15(Sat) 19:33:11)
ぽぴ王子 さんの Web サイト
No84560 (さお さん) に返信
> l_i.Remove(new int[] { 0, 0 } );
> 
> とやっても削除できません。

> と確認してみたら「偽」になってしまいました。

l_i[0] は int[] { 0, 0 } と中身は同じものが入っている
かもしれませんが、インスタンス的には別インスタンスになる
ので、そこは「偽」になると思います。
(正確には == オペレーターの実装次第になると思いますが)

l_i.Remove(l_i[0]);

ではダメな理由が何かあるのでしょうか。
あるいは

l_i.RemoveAt(0);

とか。

引用返信 編集キー/
■84563 / inTopicNo.3)  Re[1]: List に配列を入れたときRemoveができない
□投稿者/ Azulean (835回)-(2017/07/15(Sat) 23:13:30)
No84560 (さお さん) に返信
> と確認してみたら「偽」になってしまいました。
> ご見識がおありの方がいらしゃいましたら
> よろしくお願いいたします。

配列の Equals は参照(インスタンス)の比較になるので、中身が同じかどうかという判定にはなりません。
どうしても、中身が同じなら同じものとして扱いたいなら、配列を自作のクラスでラップし、そのクラスの Equals メソッドや operator== の実装で中身を比較するようにしてください。

配列のままにしたいなら、ぽぴ王子さんが言われているように RemoveAt などをおすすめしておきます。
引用返信 編集キー/
■84565 / inTopicNo.4)  Re[2]: List に配列を入れたときRemoveができない
□投稿者/ さお (2回)-(2017/07/16(Sun) 00:25:29)
みなさんありがとうございます。
RemoveAt を使いたいと思います。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ