2009-07-14 12 views
34

Zawsze się zastanawiałem, dlaczego słowo kluczowe equals dołącza, zamiast używać operatora ==.Linq: Jaka jest różnica między == a równymi w złączeniu?

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

Zamiast

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

[Edycja] rephrased pytanie i zweryfikowała przykłady.

Odpowiedz

38

Jest ładny wyjaśnienie przez Matt Warren w The Moth:

„Powodem C# ma słowo«równa się»zamiast operator«==»było, aby było jasne, że«on»Potrzeby klauzula należy podać dwa oddzielne wyrażenia, które są porównywane dla równości, a nie dla pojedynczego wyrażenia predykatów. Wzorzec odwzorowania z dołączenia do standardowego operatora kwerendy Enumerable.Join(), który określa dwa oddzielne elementy delegujące, które są używane do obliczania wartości, które można następnie porównywać. Potrzebuje ich jako oddzielnych delegatów w celu zbudowania tabeli odnośników z jednym i sondowania do tabeli odnośników z innymi. Pełne przetwarzanie zapytań, takie jak SQL, pozwala na zbadanie pojedynczego wyrażenia predykatów i wybór sposobu to go przetworzy. Jednak, aby LINQ działać podobnie do SQL wymagałoby że warunek przyłączenia być zawsze określony jako drzewo ekspresyjny znacznego narzutu dla prostego przypadku obiektu w pamięci.”

Jednak dotyczy to join. I” nie jestem pewien equals powinna być użyta w przykładzie kodu (to nawet skompilować?).

+1

Masz rację, nawet się nie kompiluje, mój zły! Minęło trochę czasu, odkąd miałem problem z == i równymi sobie, ale myślę, że było to z połączeniem wtedy, gdy przypadkowo użyłem ==. Dzięki za wyjaśnienie! –

15

Twoja pierwsza wersja nie kompiluje. Wystarczy tylko korzystanie equals w przyłącza, aby oddzielne połówki equijoin jasne kompilator

+0

Tak ... Pierwszy jest w porządku. –

+0

Tak, przepraszam, moja zła. Minęło trochę czasu odkąd miałem problem (który oczywiście był z łączeniem), gdzie przypadkowo wstawiłem == zamiast równych i zastanawiałem się, dlaczego istnieje słowo kluczowe równe sobie. Właśnie zapamiętałem to, ponieważ nie znalazłem odpowiedzi na to;) –

+0

Więc w przypadku dołączenia, czy jest uzasadnione użycie == czy zawsze powinieneś używać równań? –

Powiązane problemy