List<A> list=new List<A>();
var a=new A();
list.Add(a);
list.Contains(a);
list.Contains<A>(a);
이 두 경우의 차이점은 무엇입니까? 왜 두 가지 방법이 있습니까?C#의 Queryable.Contains 메서드와 List <T> .Contains 메서드의 차이점은 무엇입니까?
List<A> list=new List<A>();
var a=new A();
list.Add(a);
list.Contains(a);
list.Contains<A>(a);
이 두 경우의 차이점은 무엇입니까? 왜 두 가지 방법이 있습니까?C#의 Queryable.Contains 메서드와 List <T> .Contains 메서드의 차이점은 무엇입니까?
이 경우 ICollection.Contains의 구현 인 List.Contains와 Enumerable.Contains간에 차이가 없습니다. 열거 가능 항목이 컬렉션 인 경우 IEnumerable.Contains는 단순히 ICollection.Contains를 호출합니다.
SortedSet과 같은 일부 컬렉션은 O (n) 시간보다 더 잘 작동하는 Contains 메서드를 구현할 수 있다고 추론합니다. Enumerable 형식이 아닌 컬렉션의 경우 IEnumerable.Contains는 열거 형에 대해 선형 검색을 수행합니다.
또한 Queryable.Contains가 있지만 그와는 다릅니다. 목록은 쿼리 가능하지 않습니다. Queryable.Contains는 이것을 (예를 들어 SQL로) 변환 할 수있는 쿼리 표현식으로 만들 수 있습니다. 쿼리 가능하고 열거 가능한 확장 메소드는 두드러진 차이가 있습니다.
기능의 차이점에 대해 질문하는 경우 실제로는 없습니다.
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);
}
"LIST.contains"의 알고리즘 복잡성은 항상 O (n)입니다.
"Queryable.contains"로 표시된 복잡성은 구현 된 컬렉션에 따라 다릅니다. 예를 들어, 기본 집합이 "Hashset"이면 알고리즘 복잡성은 O (1)입니다.
Queryable.Contains는 HashSet에서 구현됩니까? – HaibaraAi
Queryable.Contains는 일반적으로 C# 쿼리를 SQL과 같은 다른 쿼리 유형으로 변환하는 쿼리 트리를 작성하는 클래스 인 쿼리 공급자에 의해 구현됩니다. 한 가지 예가 Entity Framework의 DbSet 또는 ObjectSet 클래스입니다. HashSet 및 List와 같은 전통적인 컬렉션은 Enumerable이지만 쿼리 할 수는 없습니다. 쿼리 가능한 컬렉션은 데이터베이스와 같은 외부 데이터 소스에 실제로 사용되는 반면 메모리의 C# 개체 컬렉션은 열거 할 수있는 경향이 있습니다. – PMV