방대한 개체 컬렉션을 감안할 때 다음간에 성능 차이가 있습니까?
컬렉션 포함 :
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
방대한 개체 컬렉션을 감안할 때 다음간에 성능 차이가 있습니까?
컬렉션 포함 :
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
답변:
Contains()
인스턴스 메서드이며 성능은 컬렉션 자체에 크게 좌우됩니다. 예를 들어, Contains()
a List
는 O (n)이고, Contains()
a HashSet
는 O (1)입니다.
Any()
확장 메서드이며 컬렉션을 통해 모든 개체에 대리자를 적용합니다. 따라서 복잡도는 O (n)입니다.
Any()
델리게이트를 전달할 수 있기 때문에 더 유연합니다. Contains()
개체 만받을 수 있습니다.
Contains
IEnumerable<T>
(일부 컬렉션에는 자체 Contains
인스턴스 메서드도 있지만) 에 대한 확장 메서드이기도합니다 . 말했듯이, Any
는 Contains
사용자 지정 조건 자를 전달할 수 있기 때문에 보다 유연 하지만 각 요소에 대해 대리자 호출을 수행 할 필요가 없기 때문에 약간 더 빠를 Contains
수 있습니다.
All()
유사하게 작동합니다.
컬렉션에 따라 다릅니다. 정렬 된 컬렉션 Contains
이있는 경우 스마트 검색 (이진, 해시, b- 트리 등)을 수행 할 수 있지만`Any ()를 사용하면 기본적으로 찾을 때까지 열거 (LINQ-to-Objects 가정)해야합니다. .
또한 귀하의 예에서 참조 평등을 확인 Any()
하는 ==
연산자를 사용하고 있으며 재정의 될 수있는 또는 메서드를 Contains
사용 IEquatable<T>
합니다 Equals()
.
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)을 반복합니다.
이것이 효과가 있기를 바랍니다 ....