Queryable.Contains方法和List<;T>;。包含C#中的方法? List List=新列表(); var a=新的a(); 列表.添加(a); 清单.包括(a); 清单.包括(a);

Queryable.Contains方法和List<;T>;。包含C#中的方法? List List=新列表(); var a=新的a(); 列表.添加(a); 清单.包括(a); 清单.包括(a);,c#,C#,这两种情况有什么区别? 为什么存在两种方法?如果您询问其功能上的差异,那么实际上没有 List.Contains()是ICollection接口的一部分,自.NET Framework 2.0以来一直存在。开发人员总是在LINQ之前使用此方法来检查List或另一个ICollection是否包含项 .Contains是LINQ的一部分。它是一种查询语言,允许您将此方法用于所有IEnumerable集合,甚至数组或自定义;数据源,如数据库;数据格式,如JSON或XML等 实际上,当您在IEnumer

这两种情况有什么区别?
为什么存在两种方法?

如果您询问其功能上的差异,那么实际上没有

List.Contains()
ICollection
接口的一部分,自.NET Framework 2.0以来一直存在。开发人员总是在LINQ之前使用此方法来检查
List
或另一个
ICollection
是否包含项

.Contains
是LINQ的一部分。它是一种查询语言,允许您将此方法用于所有
IEnumerable
集合,甚至数组或自定义;数据源,如数据库;数据格式,如JSON或XML等

实际上,当您在
IEnumerable
集合上调用LINQ
.Contains
,该集合是
ICollection
(例如,
List
),它会调用自己的
ICollection.Contains
方法

List<A> list=new List<A>();
var a=new A();
list.Add(a);
list.Contains(a);
list.Contains<A>(a);
公共静态bool包含(此IEnumerable源,TSource值)
{
ICollection collection=源作为ICollection;
if(集合!=null)
返回集合。包含(值);
返回可枚举的。包含(源、值、(IEqualityComparer)null);
}

列表包含的算法复杂度始终为O(n)


其中,“Queryable.contains”的复杂性取决于实现的集合。例如,如果基础集合是“Hashset”,则算法复杂性为O(1)

在这种情况下,List.Contains(它是ICollection.Contains的实现)和Enumerable.Contains之间没有区别-在Enumerable是集合的情况下,IEnumerable.Contains只调用ICollection.Contains

原因是一些集合(如SortedSet)可以实现一个Contains方法,该方法的运行时间优于O(n)。对于可枚举的非集合类型,IEnumerable.Contains将对枚举执行线性搜索


也有Queryable.Contains,但那是不同的-List不是可查询的。Contains可以将其构建成一个可以翻译的查询表达式(例如,转换成SQL)。Queryable和Enumerable扩展方法在本质上是非常不同的。

Queryable.Contains由HashSet实现?Queryable.Contains由查询提供程序实现,这些提供程序通常是构建查询树的类,用于将C#查询转换为其他类型的查询,如SQL。一个例子是实体框架中的DbSet或ObjectSet类。像HashSet和List这样的传统集合是可枚举的,但不可查询;可查询集合实际上用于数据库等外部数据源,而内存中的C#对象集合往往是可枚举的。
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);
}