2016-10-11 5 views

답변

2

이 경우 ICollection.Contains의 구현 인 List.Contains와 Enumerable.Contains간에 차이가 없습니다. 열거 가능 항목이 컬렉션 인 경우 IEnumerable.Contains는 단순히 ICollection.Contains를 호출합니다.

SortedSet과 같은 일부 컬렉션은 O (n) 시간보다 더 잘 작동하는 Contains 메서드를 구현할 수 있다고 추론합니다. Enumerable 형식이 아닌 컬렉션의 경우 IEnumerable.Contains는 열거 형에 대해 선형 검색을 수행합니다.

또한 Queryable.Contains가 있지만 그와는 다릅니다. 목록은 쿼리 가능하지 않습니다. Queryable.Contains는 이것을 (예를 들어 SQL로) 변환 할 수있는 쿼리 표현식으로 만들 수 있습니다. 쿼리 가능하고 열거 가능한 확장 메소드는 두드러진 차이가 있습니다.

+0

Queryable.Contains는 HashSet에서 구현됩니까? – HaibaraAi

+0

Queryable.Contains는 일반적으로 C# 쿼리를 SQL과 같은 다른 쿼리 유형으로 변환하는 쿼리 트리를 작성하는 클래스 인 쿼리 공급자에 의해 구현됩니다. 한 가지 예가 Entity Framework의 DbSet 또는 ObjectSet 클래스입니다. HashSet 및 List와 같은 전통적인 컬렉션은 Enumerable이지만 쿼리 할 수는 없습니다. 쿼리 가능한 컬렉션은 데이터베이스와 같은 외부 데이터 소스에 실제로 사용되는 반면 메모리의 C# 개체 컬렉션은 열거 할 수있는 경향이 있습니다. – PMV

0

기능의 차이점에 대해 질문하는 경우 실제로는 없습니다.

List.Contains()ICollection 인터페이스의 일부이며 .NET Framework 2.0부터 존재합니다. 개발자는 항상 LINQ 전에이 방법을 사용하여 List 또는 다른 ICollection에 항목이 있는지 확인합니다.

.Contains<T>은 LINQ의 일부입니다. 쿼리 언어로,이 메서드는 모든 IEnumerable 컬렉션, 심지어 배열 또는 사용자 정의와 함께 사용할 수 있습니다. 데이터 소스는 데이터베이스를 좋아합니다. 당신이 ICollection입니다 IEnumerable 컬렉션 LINQ .Contains<T> 호출 할 때 등 JSON 또는 XML 사실

같은 데이터 형식 (예, List<T>을 위해), 그것은 자신의 ICollection.Contains 메소드를 호출 않습니다.

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value) 
{ 
    ICollection<TSource> collection = source as ICollection<TSource>; 
    if (collection != null) 
    return collection.Contains(value); 
    return Enumerable.Contains<TSource>(source, value, (IEqualityComparer<TSource>) null); 
} 
0

"LIST.contains"의 알고리즘 복잡성은 항상 O (n)입니다.

"Queryable.contains"로 표시된 복잡성은 구현 된 컬렉션에 따라 다릅니다. 예를 들어, 기본 집합이 "Hashset"이면 알고리즘 복잡성은 O (1)입니다.

관련 문제