[C#] LINQ, Where () 대 FindAll ()

누군가 LINQ 함수 Where (..) 및 FindAll (..)이 어떻게 다른지 설명 할 수 있습니까? 둘 다 같은 일을하는 것 같습니다 …



답변

FindAll()List<T>형식 에 대한 함수 이며 .NET과 같은 LINQ 확장 메서드가 아닙니다 Where. LINQ 확장 메서드는를 구현하는 모든 형식에서 작동 IEnumerable하지만 인스턴스 (또는 인스턴스에서 상속되는 클래스의 인스턴스) FindAll에서만 사용할 수 있습니다 List<T>.

또한 실제 목적이 다릅니다. 개체가 열거 될 때 요청시 실행 Where되는 인스턴스를 반환합니다 IEnumerable. 요청 된 요소가 포함 FindAll된 새 항목 List<T>을 반환합니다 . 의 인스턴스를 FindAll호출 Where(...).ToList()하는 것과 비슷 합니다 IEnumerable.


답변

나에게 가장 큰 차이점은 .FindAll은 .Net 2.0에서도 사용할 수 있다는 것입니다. .Net 3.5에서 프로그래밍 할 수있는 사치가 항상있는 것은 아니므로 .Net 제네릭 컬렉션의 ‘네이티브’방법을 기억하려고합니다.

LINQ를 할 수 없기 때문에 이미 사용 가능한 List 메서드를 직접 구현 한 경우가 여러 번 발생했습니다.

이 경우 편리하다고 생각되는 것은 VS2008 사용하여 유형 추론과 람다 구문을 사용할 수 있다는 것입니다. 이는 프레임 워크 기능이 아니라 컴파일러 기능입니다. 이것은 내가 이것을 쓸 수 있고 여전히 .Net 2.0 내에 남아 있음을 의미합니다.

var myOddNums = myNums.FindAll(n => n%2==1);

그러나 LINQ를 사용할 수있는 경우 지연된 실행과 즉시 실행의 차이를 유지하는 것이 중요합니다.


답변

내가 올바르게 기억한다면 (구현 된 것 외에 : IEnumerable<T>vs. List<T>) 주된 차이점 은 Where지연된 실행 을 구현한다는 것입니다. FindAll즉시 실행 방법입니다.


답변

80K 개체 목록에 대해 몇 가지 테스트를 수행 한 결과 with를 Find()사용하는 것보다 최대 1000 % 더 빠를 수 있습니다 . 각 통화 전후에 타이머를 테스트 할 때까지 몰랐습니다. 때로는 같은 시간이었고 다른 때는 더 빨랐습니다. WhereFirstOrDefault()


답변