問題タブ [equals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# Equals 契約に違反するクラスのハッシュコードを選択する方法は?
Equals
特定の理由で、公式の契約に従わない複数のクラスがあります。上書きGetHashCode()
されたこれらのクラスは単純に 0 を返すため、ハッシュマップで使用できます。
これらのクラスのいくつかは同じインターフェースを実装しており、このインターフェースをキーとして使用するハッシュマップがあります。だから私は、すべてのクラスが少なくとも異なる(しかしそれでも一定の)値を返す必要があると考えましたGetHashCode()
.
問題は、この値をどのように選択するかです。最初のクラスが 1 を返し、次のクラスが 2 というように単純に返す必要がありますか? または、次のようなものを試す必要があります
ハッシュはより均等に分散されますか?(返された値を自分でキャッシュする必要がありますか、それとも Microsoft のコンパイラでこれを最適化できますか?)
更新: Equals は規約に違反しているため、オブジェクトごとに個別のハッシュコードを返すことはできません。具体的には、この問題について言及しています。
java - メソッドが NoSuchMethodError をスローするのはなぜですか?
除外されたフィールドのリストを使用して、reflectionEquals メソッドを正常に実装しました。
しかし、最近 Java 1.5 でプログラムをコンパイルしたところ、プログラムが上記の行に到達すると次のエラーが発生しました。
java.lang.NoSuchMethodError: org.apache.commons.lang.builder.EqualsBuilder.= reflectionEquals(Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/String;)Z
実行時にメソッドが存在しない理由について誰かが洞察を持っている場合は、感謝します
c# - 可変オブジェクトの GetHashCode をオーバーライドしますか?
いつ、どのようにオーバーライドするかについて、約 10 の異なる質問を読みましたが、GetHashCode
まだよくわからないことがあります。のほとんどの実装はGetHashCode
、オブジェクトのフィールドのハッシュ コードに基づいていますが、 の値はGetHashCode
オブジェクトの存続期間にわたって変更されるべきではないとされています。それが基づいているフィールドが可変である場合、それはどのように機能しますか? また、オーバーライドされたものではなく、参照の等価性に基づいて辞書検索などを行いたい場合はどうすればよいEquals
ですか?
私は主にEquals
、シリアル化と逆シリアル化 (私の場合は XML へ) によって参照の等価性が失われると想定しているシリアル化コードの単体テストを容易にするためにオーバーライドしているため、少なくとも値の等価性によって正しいことを確認したいと考えています。この場合、オーバーライドEquals
するのは悪い習慣ですか? 基本的に、実行中のコードのほとんどで、参照の等価性が必要であり、常に使用==
しており、それをオーバーライドしていません。ValueEquals
オーバーライドする代わりに、新しいメソッドなどを作成する必要がありますEquals
か? 私は、フレームワークが常に物事を比較するために and を使用==
しないと想定していたEquals
ので、オーバーライドしても安全だと思っていEquals
ました。==
オペレーター。他のいくつかの質問を読むと、そうではないようです。
編集:
私の意図が不明確だったようです。私が言いたいのは、99% の時間は単純な古い参照の等価性、デフォルトの動作、驚きがないことを望んでいるということです。.Equals
非常にまれなケースですが、値の等価性が必要であり、代わりに を使用して値の等価性を明示的に要求したいと考えています==
。
これを行うと、コンパイラはオーバーライドGetHashCode
も推奨するため、この質問が出てきました。GetHashCode
変更可能なオブジェクトに適用する場合、次のような矛盾する目標があるように見えました。
- もしそう
a.Equals(b)
なら。a.GetHashCode()
== b.GetHashCode()
- の値は
a.GetHashCode()
、 の存続期間中は変更されませんa
。
オブジェクトの状態が変化すると、 の値が変化することが予想されるため、これらは当然矛盾しているように.Equals()
見えGetHashCode
ます。.Equals()
GetHashCode
なぜこのような矛盾があるように見えるのでしょうか? これらの推奨事項は、変更可能なオブジェクトに適用するためのものではありませんか? おそらく想定されていますが、構造体ではなくクラスについて言及していることに言及する価値があるかもしれません。
解像度:
私は JaredPar を承認済みとしてマークしていますが、主にコメントのやり取りのためです。ここから学んだことをまとめると、すべての目標を達成し、エッジ ケースで発生する可能性のある風変わりな動作を回避する唯一の方法は、オーバーライドEquals
しGetHashCode
て不変フィールドに基づくか、または を実装することIEquatable
です。Equals
この種の参照型は、主キーでそれらを識別するためにリレーショナル データベースに格納されていない限り、ほとんどの参照型は通常、不変フィールドを持たないことがわかっているため、参照型のオーバーライドの有用性を損なうようです。
ms-access - Textbox エントリに基づいて Access Listbox コントロールの項目をプログラムで検索する
これが可能かどうかはわかりませんが、データベースの検索エンジン エントリ コントロールとして機能する Access テキスト ボックスをコーディングしようとしています。具体的には、複数の非表示のリストボックスをフォームに追加し、それらにテーブルまたはクエリ データを入力したいと考えていました。エンドユーザーがテキストボックスに検索語を入力して検索を押すたびに、テキストボックスのエントリがリストボックスのいずれかの値と一致するかどうかを指定する一連の「if」ステートメントを記述して、カスタムを実行したいと考えました。クエリ。例えば:
if (Me.textbox.text = リストボックスの値) then etc ...
問題は、私がこれまでに見たすべての例は、数値または listbox.selected(0) などのインデックスによってのみリストボックスの値を検索することです。テキストボックスは数値ではなく文字列値を取るため、コードはテキストボックスのエントリをリストボックスの項目と同一視する必要があります。検索テキストボックスに数字を追加してリストボックス項目を見つけることはできましたが、エンドユーザーは値しか知らないため、これは実用的ではありません。全体として、テキストボックスに入力された値と等しい特定の値をリストボックスでプログラムで検索する方法を誰かが知っているかどうか疑問に思っていました。
ありがとうございました、
DFM
.net - .NETクラスの深い構造体のようなEquals()?
それらの中に参照ループを含まない2つのオブジェクトが与えられた場合、「一般的な」方法で(リフレクションを介して)それらの同等性をテストする方法を知っていますか?
基本的に、クラスでのみ、構造体の同等性と同じセマンティクスが必要です。
c# - それぞれ値型と参照型の最も完全な Equals 実装
Point3 (たとえば) のような参照型 (クラス) の場合、これはやり過ぎで、以下が欠けています:
再実装するたびにあまり考えずに基本型 (値と参照) で使用できるように、値と参照の両方の型を調整するか、新しいものを投稿してください。
編集:これは不変型用です。
java - 整数値の比較
私は初心者のJavaコーダーであり、整数クラスの変数を読み取るだけで、APIで3つの異なる方法で記述できます。私は次のコードを持っています:
これはループ内にあり、出力するだけout_table
です。
私の目標は、整数の値かどうかを確認する方法を理解することですcount > 0
。
私count.compare(0)
はそれが正しい方法だと思いますか?それともそれcount.equals(0)
ですか?
私はcount == 0
が間違っていることを知っています。これは正しいですか?値比較演算子はありcount=0
ますか?
c# - Equals メソッド実装ヘルパー (C#)
データ クラスを作成するたびに、IEquatable の実装に多くの時間を費やします。
私が書いた最後のクラスは次のようなものでした:
IEquatable の実装は非常に困難でした。確かに C#3.0/LINQ は大いに役立ちますが、頂点をシフトしたり、逆の順序にしたりできるため、Equals メソッドが非常に複雑になります。多くの単体テストと対応する実装の後、あきらめて、アプリケーションを三角形のみを受け入れるように変更しました。IEquatable の実装では、11 個の単体テストのみを完全にカバーする必要がありました。
Equals と GetHashCode の実装に役立つツールまたは手法はありますか?