39

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

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();

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

4

2 に答える 2

43

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

「C# に '==' 演算子の代わりに 'equals' という単語がある理由は、'on' 句では、単一の述語式ではなく、等しいかどうかを比較する 2 つの別個の式を指定する必要があることを明確にするためです。from- join pattern maps to the Enumerable.Join() standard query operator that defines two separate delegates that are used to compute values that can then be comparison. 1 つのルックアップ テーブルを構築し、ルックアップをプローブするには、それらを別個のデリゲートとして必要とします。 SQL のような完全なクエリ プロセッサでは、単一の述語式を自由に調べて、それを処理する方法を選択できます. ただし、LINQ を SQL と同様に動作させるには、結合条件を常に式として指定する必要があります。単純なメモリ内オブジェクトの場合、かなりのオーバーヘッドになります。」

ただし、これは懸念事項joinです。コード例で使用する必要があるかどうかはわかりませんequals(コンパイルできますか?)。

于 2009-07-14T07:12:11.357 に答える
17

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

于 2009-07-14T07:16:04.720 に答える