Queryable之间有什么区别?包含方法和列表< >包含c#中的方法

本文关键字:包含 方法 列表 区别 什么 之间 Queryable | 更新日期: 2023-09-27 18:12:41

List<A> list=new List<A>();
var a=new A();
list.Add(a);
list.Contains(a);
list.Contains<A>(a);

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

Queryable之间有什么区别?包含方法和列表< >包含c#中的方法

在这种情况下,List和List之间没有区别。Contains(它是iccollection .Contains的实现)和Enumerable。包含-当枚举对象是一个集合时,使用IEnumerable。Contains只调用iccollection .Contains.

这里的原因是一些集合——比如SortedSet——可以实现一个操作时间优于O(n)的Contains方法。对于Enumerable的非集合类型,IEnumerable。Contains将对枚举进行线性搜索。

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

如果你问它在功能上有什么不同,那么实际上没有。

List.Contains()ICollection接口的一部分,从。net Framework 2.0开始存在。在LINQ之前,开发人员一直使用这种方法来检查List或其他ICollection是否包含项目。

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

实际上,当你在IEnumerable集合上调用LINQ .Contains<T>,即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);
}

LIST的算法复杂度。

其中为"可查询的"。复杂度取决于所实现的集合。例如,如果底层集合是"Hashset",则算法复杂度为O(1)。