2016-10-11 24 views

回答

2

List.Contains(這是ICollection.Contains的實現)和Enumerable.Contains在這種情況下沒有區別 - 在enumerable是集合的情況下,IEnumerable.Contains只是調用ICollection.Contains。

推理是有些集合 - 比如SortedSet - 可以實現一個Contains方法,其運行時間比O(n)更好。對於Enumerable的非集合類型,IEnumerable.Contains將對枚舉進行線性搜索。

還有Queryable.Contains,但這是不同的 - 列表不是可查詢的。 Queryable.Contains可以將其構建到可以翻譯的查詢表達式中(例如,轉換爲SQL)。引擎蓋下的Queryable和Enumerable擴展方法非常不同。

+0

Queryable.Contains是由HashSet實現的嗎? – HaibaraAi

+0

Queryable.Contains由查詢提供者實現,查詢提供者通常是構建查詢樹以將C#查詢轉換爲其他類型的查詢(如SQL)的類。一個例子是來自實體框架的DbSet或ObjectSet類。像HashSet和List這樣的傳統集合可枚舉但不可查詢;可查詢集合實際上用於數據庫等外部數據源,而內存中的C#對象集合通常只是Enumerable。 – PMV

0

如果您詢問其功能差異,那麼實際上沒有。

List.Contains()ICollection接口的一部分,自.NET Framework 2.0開始存在。開發人員在LINQ之前一直使用這種方法來檢查List或其他ICollection是否包含項目。

.Contains<T>是LINQ的一部分。它是一種查詢語言,允許您在所有IEnumerable集合中使用此方法,甚至可以使用數組或自定義;數據源喜歡數據庫;數據格式,如JSON或XML等

其實,當你調用LINQ .Contains<T>IEnumerable收集這是ICollection(例如,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)。

相關問題