web-dev-qa-db-ja.com

Linq:結合における==とequalsの違いは何ですか?

==演算子を使用するのではなく、linq結合にequalsキーワードがあるのはなぜかといつも疑問に思いました。

Property deadline =
(from p in properties
 join w in widgets
    on p.WidgetID equals w.ID
 select p).First();

の代わりに

Property deadline =
(from p in properties
 join w in widgets
    on p.WidgetID == w.ID
 select p).First();

[EDIT]質問を言い換え、例を修正しました。

38
Michael Klement

The Moth にMatt Warrenによる素晴らしい説明があります。

「C#に「==」演算子の代わりに「等しい」という単語がある理由は、「on」句が、単一の述語式ではなく、等しいかどうか比較される2つの別々の式を提供する必要があることを明確にするためでした。結合パターンは、比較可能な値を計算するために使用される2つの個別のデリゲートを指定するEnumerable.Join()標準クエリ演算子にマップされます。1つでルックアップテーブルを作成し、ルックアップにプローブするには、それらを個別のデリゲートとして必要とします。 SQLのような完全なクエリプロセッサは、単一の述語式を自由に調べて、その処理方法を選択できます。ただし、LINQをSQLと同様に動作させるには、結合条件を常に式として指定する必要があります。ツリー、単純なメモリ内オブジェクトの場合の重要なオーバーヘッド。」

ただし、これはjoinに関係します。コード例でequalsを使用する必要があるかどうかはわかりません(コンパイルも可能ですか?)。

42
Konrad Rudolph

最初のバージョンはコンパイルされません。 only結合でequalsを使用して、等結合の別々の半分をコンパイラに明確にします。

17
Jon Skeet