LINQ Ring : 대규모 컬렉션에 대한 Any () 대 Contains ()
방대한 개체 컬렉션을 감안할 때 다음간에 성능 차이가 있습니까?
컬렉션 포함 :
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
Contains ()는 인스턴스 메서드이며 그 성능은 컬렉션 자체에 크게 좌우됩니다. 예를 들어, List의 Contains ()는 O (n)이고 HashSet의 Contains ()는 O (1)입니다.
Any ()는 확장 메서드이며 모든 개체에 대리자를 적용하여 컬렉션을 간단히 살펴 봅니다. 따라서 복잡도는 O (n)입니다.
Any ()는 델리게이트를 전달할 수 있기 때문에 더 유연합니다. Contains ()는 객체 만받을 수 있습니다.
컬렉션에 따라 다릅니다. 정렬 된 컬렉션이있는 경우 Contains는 스마트 검색 (이진, 해시, b- 트리 등)을 수행 할 수 있지만 Any ()에서는 기본적으로 찾을 때까지 열거 (LINQ to Objects로 가정)해야합니다.
또한 예제에서 Any ()는 참조 동등성을 확인하는 "=="연산자를 사용하고, Contains는 재정의 될 수있는 IEquitable 또는 Equals () 메서드를 사용합니다.
나는 그것이 구현 myCollection
방법을 지시하는 유형에 달려 있다고 생각합니다 Contains()
. 예를 들어 정렬 된 이진 트리의 경우 더 스마트하게 검색 할 수 있습니다. 또한 요소의 해시를 고려할 수 있습니다. Any()
반면에 조건을 만족하는 첫 번째 요소를 찾을 때까지 컬렉션을 통해 열거됩니다. 객체에 더 스마트 한 검색 방법이 있는지에 대한 최적화는 없습니다.
Contains ()는 올바른 방법으로 사용하면 빠르게 작동 할 수있는 확장 메서드이기도합니다. 예 :
var result = context.Projects.Where(x => lstBizIds.Contains(x.businessId)).Select(x => x.projectId).ToList();
이것은 쿼리를 제공합니다
SELECT Id FROM Projects INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item
반면에 Any ()는 항상 O (n)을 반복합니다.
이것이 효과가 있기를 바랍니다 ....
참고 URL : https://stackoverflow.com/questions/4445219/linq-ring-any-vs-contains-for-huge-collections
'Programing' 카테고리의 다른 글
"작은 첨자가있는 요소"를 포함하여 모든 중복 행 찾기 (0) | 2020.08.25 |
---|---|
인스펙터 (웹킷, 방화범 등)에서 CSS 변경 사항 내보내기 (0) | 2020.08.25 |
perror ( "…") 및 fprintf (stderr, "…")는 언제 사용해야합니까? (0) | 2020.08.25 |
ECMAScript 6 클래스의 게터와 세터는 무엇입니까? (0) | 2020.08.25 |
ngRepeat '추적 기준'표현식 이해 (0) | 2020.08.25 |