development

LINQ, Where () 및 FindAll ()

big-blog 2020. 7. 24. 07:16
반응형

LINQ, Where () 및 FindAll ()


LINQ의 Where (..)와 FindAll (..) 기능이 어떻게 다른지 설명 할 수 있습니까? 둘 다 같은 일을하는 것 같습니다 ...


FindAll()List<T>유형 에 대한 함수이며 와 같은 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지연된 실행 구현한다는 것입니다. 예를 들어 foreach 루프에서 사용하여 실제로 필요할 때까지 조회를 수행하지 않습니다. FindAll즉각적인 실행 방법입니다.


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

참고 URL : https://stackoverflow.com/questions/1938204/linq-where-vs-findall

반응형