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);
这两种情况有什么区别?为什么存在两种方法?
在这种情况下,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)。