6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

同じ値を持つ配列を比較しても等価にならない

Last updated at Posted at 2018-03-10

同じ値を持つ配列二つを比較しても、等しくない。

var array1 = new int[] { 4 };
var array2 = new int[] { 4 };

// Trueが出力される(二つの配列が持つ値は等価である)
Console.WriteLine(array1[0].Equals(array2[0]));

// Falseが出力される(二つの配列は等しくない)
Console.WriteLine(array1.Equals(array2));

配列ではなく、数値型の変数で比較したら、等価である。

var int1 = 4;
var int2 = 4;

// Trueが出力される(二つの数値は等価である)
Console.WriteLine(int1.Equals(int2));

つまりクラスのようにnewしたオブジェクトは、たとえ一時的に同じ値を持っているとしても、比較したら等しくない。

var class1 = new Hoge();
var class2 = new Hoge();

// Falseが出力される(二つのクラスは等しくない)
Console.WriteLine(class1.Equals(class2));

先ほど等しくないと認定された配列やクラスも、比較先の変数をまるっと代入すれば等価になる。

array1 = array2;

// Trueが出力される(二つの配列は等価である)
Console.WriteLine(array1.Equals(array2));

class1 = class2;

// Trueが出力される(二つのクラスは等価である)
Console.WriteLine(class1.Equals(class2));

これは、array1やclass1に代入されていた値はもう見なくなり、array2やclass2の中身(参照先)を見るようになるから。

なお、文字列は、同じ値を持っていたら同一である。
文字列は参照型。したがって、「参照型は同じ値でも等しくない」とは言えず、今回の話題とはまた別の話。

var string1 = "hoge";
var string2 = "hoge";

// Trueが出力される(二つの文字列は等価である)
Console.WriteLine(string1.Equals(string2));

(以下コメントいただいた内容について、追記しました。)

Linqでシーケンスを扱うためのSequenceEqualメソッドを使用すると、配列の要素が全部同じかどうかを判定してくれる。


using System.Linq;

var array1 = new int[] { 4 };
var array2 = new int[] { 4 };

// Trueが出力される(二つの配列が持つ値は等価である)
Console.WriteLine(array1.SequenceEqual(array2));
6
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?