누군가 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를 사용할 수있는 경우 지연된 실행과 즉시 실행의 차이를 유지하는 것이 중요합니다.
80K 개체 목록에 대해 몇 가지 테스트를 수행 한 결과 with를 Find()
사용하는 것보다 최대 1000 % 더 빠를 수 있습니다 . 각 통화 전후에 타이머를 테스트 할 때까지 몰랐습니다. 때로는 같은 시간이었고 다른 때는 더 빨랐습니다. Where
FirstOrDefault()