LINQ, Where () 대 FindAll ()


답변:


203

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

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


20
예, findall의 게으른 버전은 어디에 있습니까?
Pierreten 2009

2
code.msdn.microsoft.com/LINQ-Query-Execution-ce0d3b95 는 지연 (지연) 실행과 즉시 실행의 차이점을 설명합니다. 기본적으로 어떤 경우에는 전체 목록이 필요하지 않으며 어떤 일이 발생할 때까지 항목을 반복 한 다음 중지 할 수 있습니다. 이것은 lazy가 편리하지만 구현에 따라 예측할 수없는 결과를 초래할 수 있습니다 (모두 링크에 설명되어 있음). 도움이 되었기를 바랍니다.
nurchi

10

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

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

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

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

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


6

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


3

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


5
컬렉션에도 액세스 해 보셨습니까? Enumerable.Where ()는 지연된 실행을 사용하고 컬렉션에 액세스하기 전에 평가되지 않으므로 실제로 더 빠른지 여부에 대한 잘못된 개념으로 이어질 수 있습니다. 그러나 대부분의 경우 정적 컬렉션 (Type <T> 및 Array <T> 등)보다 열거 형을 사용하는 것이 더 빠릅니다.
Sebastian Job Bjørnager Jensen 2014

FindAll에 관한 질문입니다. 그것은 명백한 찾기가보다 빠른 것 인 경우 (모든 값 복용)와 FirstOrDefault 점점
비벡 MVK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.