Programing

LINQ Ring : 대규모 컬렉션에 대한 Any () 대 Contains ()

lottogame 2020. 8. 25. 19:18
반응형

LINQ Ring : 대규모 컬렉션에 대한 Any () 대 Contains ()


방대한 개체 컬렉션을 감안할 때 다음간에 성능 차이가 있습니까?

컬렉션 포함 :

myCollection.Contains(myElement)

Enumerable.Any :

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

반응형