2012-07-23 4 views
1

ID가 잠재적으로 일치하는 ID 필드가있는 두 가지 유형의 개체가 있습니다. FindAll 작업은 일치하지 않는 올바른 개체를 반환하지만 Where 작업은 모든 개체를 반환합니다. 누군가 제가 왜 이해하는지 도울 수 있습니까?Linq FindAll 및 Where는 다른 결과를 반환합니다.

var _kenticoIDs = new HashSet<string>(_kenticoSessions.Select(p => p.AttendeeInteractiveSessionID)); 
var list = _aiSessionIDList.FindAll(p => !_kenticoIDs.Contains(p.SessionID)); 
var ienum = _aiSessionIDList.Where(p => !_kenticoIDs.Contains(p.SessionID)); 

EDIT : resultA 변수에서. 그러나 두 변수 (result/resultA)를 .ToList() 전에 검사 할 때 6 개의 값을 갖고 하나는 63 개의 값을가집니다. 나는 명백한 무엇인가 놓치고있는 것처럼 느낀다.

+3

코드는 읽을 수없는 시점까지 * 끔찍하게 * 형식이 지정되어 있습니다. 고쳐주세요. –

+0

목록에있는 항목의 ID가 '_kenticoIDs' 해시가 아닐지라도'_aiSessionIDList.Where (p =>! _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -SessionID) '의 모든 항목을 반환한다고 말하고 있습니까? –

답변

5

WhereFindAll는이 실행의 측면에서, Where이 지연됩니다 제외하고는 동일하지만, FindAll은 즉시이다.

출처 : This SO 스레드.

+0

이전에 정확한 질문을 보았으나 연기 된 실행을 보았지만 디버거에서 검사하는 것이 주문형 작업과 동일하다고 잘못 믿었습니다. – Jay

+0

오케이. 다음 번엔 LINQ 변수를 다룰 때 '지연된'실행 컨텍스트를 의식해야합니다. 좋은 방법은 Count() 메서드를 호출하여 'Watch'창에서 즉시 평가하도록하는 것입니다. – Channs

+0

그래, 나는 바보처럼 느껴진다. ToList()를 수행하기 전까지는 실제로 결과 세트를 평가하기 위해 아무 것도하지 않았다는 것을 깨닫지 못했습니다. – Jay

2

저는 Linq를 이해하는 데 문제가 있다고 생각합니다. Where is a Linq extension method 인 반면 FindAll은 List 메서드입니다. Linq 표현식은 열거되거나 목록/배열로 바뀔 때까지 평가되지 않습니다.

관련 문제