문제

C #에서 컬렉션을 필터링하는 매우 빠른 방법을 찾고 있습니다.현재 일반 List 컬렉션을 사용하고 있지만 성능이 더 좋은 경우 다른 구조를 사용할 수 있습니다.

현재는 새 List 를 만들고 원래 목록을 반복합니다.필터링 기준이 일치하면 새 목록에 사본을 넣습니다.

더 나은 방법이 있습니까?임시 목록이 필요하지 않도록 제자리에서 필터링하는 방법이 있습니까?

도움이 되었습니까?

해결책

C # 3.0을 사용하는 경우 linq를 사용하면 훨씬 더 좋고 우아하게 사용할 수 있습니다. 라코 디스

.Where를 찾을 수 없다면 파일 상단에서 using System.Linq;를 가져와야합니다.

다른 팁

다음은 Lambda 및 LINQ 기반 목록 필터링을 보여주기 위해 함께 조합 한 세 가지 다른 방법을 사용한 일부 목록 필터링의 코드 블록 / 예입니다. 라코 디스

List에는 필터링을 수행하고 목록의 하위 집합을 반환하는 FindAll 메서드가 있습니다.

msdn에는 다음과 같은 훌륭한 코드 예제가 있습니다. http ://msdn.microsoft.com/en-us/library/aa701359(VS.80).aspx 편집 : Linq와 Where () 메서드를 잘 이해하기 전에이 글을 썼습니다.오늘이 글을 쓴다면 아마도 Jorge가 위에서 언급 한 방법을 사용할 것입니다..NET 2.0 환경에 갇혀있는 경우에도 FindAll 메서드가 작동합니다.

IEnumerable을 사용하면 임시 목록이 필요하지 않습니다. 라코 디스

여기서 Matches는 필터 방법의 이름입니다.다음과 같이 사용할 수 있습니다. 라코 디스

필요할 때 GetFilteredItems 함수를 호출하며 필터링 된 컬렉션의 모든 항목을 사용하지 않는 경우에는 좋은 성능 향상을 제공 할 수 있습니다.

목록의 FindAll 메서드를 사용하여필터링 할 델리게이트.하지만 저는 @ IainMH 에 동의합니다.엄청난 목록.

제자리에서 수행하려면 사용자 지정 "Predicate"클래스와 함께 "List <>"클래스의 RemoveAll 메서드를 사용할 수 있습니다.하지만 코드를 정리하는 것뿐입니다.당신과 똑같은 일을하고 있습니다 ...하지만 예, 제자리에서하므로 임시 목록도 똑같이합니다.

Linq를 사용하는 것은 Lists FindAll 메소드에 제공된 술어를 사용하는 것보다 상대적으로 느립니다.또한 결과에 액세스 할 때까지 목록의 eumeration이 실제로 실행되지 않으므로 Linq에주의해야합니다.이는 필터링 된 목록을 만들었다 고 생각할 때 콘텐츠가 실제로 읽을 때 예상했던 것과 다를 수 있음을 의미합니다.

<인용구> <인용구>

C # 3.0을 사용하는 경우 linq를 사용할 수 있습니다.

또는 원하는 경우 C # 3 컴파일러에서 제공하는 특수 쿼리 구문을 사용합니다. 라코 디스

목록이 매우 크고 반복적으로 필터링하는 경우 필터 속성에서 원래 목록을 정렬하고 이진 검색을 통해 시작 지점과 끝 지점을 찾을 수 있습니다.

초기 시간 O (n * log (n)) 다음에 O (log (n))

표준 필터링은 매번 O (n)을 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top