List<A> list=new List<A>();
var a=new A();
list.Add(a);
list.Contains(a);
list.Contains<A>(a);
この2つのケースの違いは何ですか? なぜ2つの方法が存在するのですか?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);
この2つのケースの違いは何ですか? なぜ2つの方法が存在するのですか?C#のQueryable.ContainsメソッドとList <T> .Containsメソッドの違いは何ですか?
この場合、List.Contains(ICollection.Containsの実装)とEnumerable.Containsの間に違いはありません.Enumerable.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
(たとえば、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);
}
"LIST.contains"のアルゴリズムの複雑さは常にO(n)です。
「Queryable.contains」という複雑さは、実装されたコレクションによって異なります。例えば、基礎となるコレクションが「ハッシュセット」である場合、アルゴリズムの複雑さはO(1)である。
Queryable.ContainsはHashSetで実装されていますか? – HaibaraAi
Queryable.Containsは、通常、C#クエリをSQLなどの他のタイプのクエリに変換するクエリツリーを構築するクラスであるクエリプロバイダによって実装されます。 1つの例は、Entity FrameworkのDbSetまたはObjectSetクラスです。 HashSetやListのような伝統的なコレクションはEnumerableですが、クエリ可能ではありません。クエリ可能なコレクションはデータベースなどの外部データソースに実際に使用されますが、メモリ内のC#オブジェクトコレクションは単なる列挙型になる傾向があります。 – PMV