2011-06-10 1 views
4

나는이 (가) LINQ와 함께 다음과 같은 것을 할 경우 : HashSet에 최적화 된 구현LINQ는 입력 유형에 따라 특수화 된/최적화 된 기능 버전을 사용합니까?

void DoSomeStuffWithHashSet() 
{ 
    HashSet<int> set = new HashSet<int>(); 
    for (int i = 0; i < 100; ++i) set.Add(i); 
    if (Lookup(set, new Random().NextInt(200)) 
    System.Console.WriteLine("Yey"); 
    else 
    System.Console.WriteLine("Ney"); 
} 

bool Lookup(IEnumerable<int> haystack, int needle) 
{ 
    // O(N) search or HashSet<int>.Contains()? 
    return Enumerable.Contains(collection, needle); 
} 

Enumerable.Contains() 결의를하거나 간단한 검색에 관계없이 입력을 수행 할 것인가?

답변

6

예, HashSet<T>.Contains을 사용합니다. HashSet<T>ICollection<T>을 구현하고 documentation for Enumerable.Contains 당 :

소스의 종류 ICollection<T>를 구현하는 경우, 그 실행에있어서 Contains 결과를 획득하기 위해 호출된다. 그렇지 않은 경우,이 메소드는 소스가 지정된 요소를 포함하는지 여부를 판별합니다.

항상 항상 설명서를 확인하십시오! 어떤 경우에는 -

+0

아, 나는 그것을 놓쳤습니다. – larsmoa

+2

이것은 동일한 비교자를 사용하지 않고 'Contains'를 의미하는 것은 키 유형에 대한 기본 동등 비교자를 사용하여 'Contains'를 호출하는 것과 같지 않습니다. 그것은 API, IMO의 혼란스러운 비트입니다. –

0

그것은 결국 자체가 HashSet

+1

질문을 잘못 이해했다고 생각합니다. 어느 쪽이든, 또는 당신이 대답을 아주 명확하게 설명하고 있지 않습니다. –

2

예, 그것은 않습니다 사용 Object.Equals를 호출하는 IEqualityComparer<T> 호출합니다. 아니요 언제든지 생각할 수 있습니다.

Edulinq 작성의 일환으로 최적화시 두 개의 게시물 (part 40; part 42)을 작성했습니다. 기본적으로 유효한 최적화로 간주되는 것은 항상 명확하지는 않지만 LINQ to Object가 컬렉션의 실행 시간 유형을 기반으로 최적화하는 경우는 많습니다. 이 대부분 시퀀스가 ​​아닌 단일 값을 반환하는 메서드의 경우입니다.

관련 문제