none
クラスのインスタンスの比較をするには RRS feed

  • 質問

  • クラスの比較をして、同一の値をもったクラスであるか確認する良い方法はないでしょうか?

    たとえばこのようなクラスがあったとして

        class neko
        {
            public string Name;
            public int Size;
        }

    値が同じインスタンスを2つ作って、object.Equalsで比較すると

                neko cat1 = new neko();
                cat1.Name = "tama";
                cat1.Size = 50;

                neko cat2 = new neko();
                cat2.Name = "tama";
                cat2.Size = 50;

                object o1 = (object)cat1;
                object o2 = (object)cat2;

                if (o1.Equals(o2)) Console.ReadLine();←ここでFalse

    同じ値なのでTrueが返るのを期待しているのですが、インスタンスそのものは違うためFalseが返ってきます。

    単純にNameやSizeを比較して完全一致したらTrueを返す比較メソッドを追加すればいいのですが、

    クラスの仕様が変わると比較メソッドも修正する必要がでてきます。

     

    別インスタンスだが、値が同じものを調べる良い方法はないでしょうか?

    2008年2月18日 8:38

回答

  • 値が等価であるかについては、そのクラスで以下を行うといいです。
    Object.Equals メソッドのヘルプに、詳しい説明があります。

    • Equals メソッド(および GetHashCode メソッド)のオーバーライド。
    • "==" および "!=" 演算子のオーバーロード。

    もし neko が値型(今回は struct)であれば、上記を行わなくても期待されている結果が得られます。

    # class が良いか struct が良いかは別の話ですが。

     

    じゃんぬねっとさんが書かれてる IComparable 等は、値の順序が重要な場合かと思います。

    2008年2月18日 12:07

すべての返信

  • インスタンスの比較ではなく、インスタンスが保持する値の比較ですね。

    比較するための専用のメソッドを設けることになります。

     

    場合によっては IComparable と IComparer インターフェイスあたりも調べてみると吉かもしれません。

    2008年2月18日 9:05
  • 値が等価であるかについては、そのクラスで以下を行うといいです。
    Object.Equals メソッドのヘルプに、詳しい説明があります。

    • Equals メソッド(および GetHashCode メソッド)のオーバーライド。
    • "==" および "!=" 演算子のオーバーロード。

    もし neko が値型(今回は struct)であれば、上記を行わなくても期待されている結果が得られます。

    # class が良いか struct が良いかは別の話ですが。

     

    じゃんぬねっとさんが書かれてる IComparable 等は、値の順序が重要な場合かと思います。

    2008年2月18日 12:07
  • クラスでなく構造体を使えば期待した挙動を得られるのは知りませんでした

    値型で済むなら構造体を使って比較することにします

     

    ありがとうございます

    2008年2月19日 0:23
  • 1点補足させていただきます。
    struct のメンバフィールドの型によっては「ビット単位で等しい状態」にならないので、Equals 等の実装も検討された方がよいかと思います。例えば、構造体にクラスのインスタンスを持つようにすると、期待通りにならなくなります。
    この点にはご注意ください。

    2008年2月19日 1:44