2016-10-11 5 views

答えて

2

この場合、List.Contains(ICollection.Containsの実装)とEnumerable.Containsの間に違いはありません.Enumerable.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などの他のタイプのクエリに変換するクエリツリーを構築するクラスであるクエリプロバイダによって実装されます。 1つの例は、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(たとえば、List<T>)であるIEnumerableコレクションでLINQ .Contains<T>を呼び出すときにJSONやXMLなどのようなデータ形式

は実際に、それは自身の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」という複雑さは、実装されたコレクションによって異なります。例えば、基礎となるコレクションが「ハッシュセット」である場合、アルゴリズムの複雑さはO(1)である。

関連する問題