2009-07-14 2 views
34

항상 == 연산자를 사용하는 대신 linq 조인에 equals 키워드가있는 이유는 궁금합니다. 대신Linq : 조인에서 ==와 equals의 차이점은 무엇입니까?

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

[편집]

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

질문을 고쳐 및 예제를 수정.

답변

38

The Moth에서 매트 워렌하여 좋은 설명이있다 :

는 "이유는 C#을 단어 '같음'을 가지고는 '=='연산자는 분명히 '에'절에 필요한 것을 만드는 것이 었 대신 단일 조인식이 아닌 동등성에 대해 비교되는 두 개의 개별 식을 제공해야합니다. 조인 패턴은 비교할 수있는 값을 계산하는 데 사용되는 두 개의 개별 대리자를 지정하는 Enumerable.Join() 표준 쿼리 연산자에 매핑됩니다. 하나의 조회 테이블과 다른 조회 테이블에 대한 조사를 구축하기 위해 별도의 대리인이 필요합니다. SQL과 같은 전체 쿼리 프로세서는 단일 조건부 표현식을 검사하고 그것을 처리 할 것입니다. 그러나 LINQ는 가입 조건이 항상 식 트리, 간단한 메모리 오브젝트 케이스에 대한 상당한 오버 헤드로 지정하는 것이 필요 SQL과 유사한 작동 할 수 있도록합니다. "

그러나,이 join에 관한 것이다. I '를 equals 확인은 (심지어 컴파일합니까?) 코드 예제에서 사용되어야하고 있지 않다.

+1

당신 말이 맞아요, 심지어 컴파일되지 않습니다, 내 나쁜! ==와 equals에 문제가 생겨서 얼마 동안 지났지 만, 우연히 ==를 사용했을 때 그때의 조인과 같았습니다. 어쨌든, 설명 주셔서 감사합니다! –

15

첫 번째 버전은, 조인에. 당신 사용 equals을 컴파일되지 않습니다에 동등 조인의 별도의 반쪽을 명확하게하기 위해 컴파일러.

+0

예 ... 첫 번째 문제는 없습니다. –

+0

그래, 미안하지만, 나쁘다. 문제가 생겼던 지 꽤 오랜 시간이 지났습니다. (물론 조인이있었습니다), 우연히 equals 대신에 ==를 넣고 처음에는 equals 키워드가 왜 있는지 궁금해했습니다. 방금 답변을 찾지 못했기 때문에 기억했습니다.) –

+0

그래서 join case에서 ==를 사용하는 것이 정당한가? 아니면 항상 equals를 사용해야합니까? –

관련 문제