包含和包含之间的区别<>在 c# 中
本文关键字:包含 区别 之间 | 更新日期: 2023-09-27 18:31:20
我可能很愚蠢,但是在VS耳语帮助中contains
和contains<>
有什么区别?有时我两者都得到,有时只有<>的那个。
他们的事情是我试图在 SO 上找到的一些解决方案中使用包含,但它抛出错误,我最好重载方法有一些无效参数(他们的方法是System.Linq.ParallelEnumerable.Contains<TSource>(...)
)。
我的代码是这样的:
defaultDL = db.SomeEntity
.Where(dl => dl.Something == this.Something
&& (dl.AllLocation == true || this.SomeOtherEntity.Select(loc => loc.Location).Contains(dl.Location)))
.ToList();
如果导航到System.Linq.Enumerable.Contains
方法的定义,您将看到它被声明为泛型扩展方法。
public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value);
之所以有时用<type>
参数调用它,有时不使用 - 是因为大多数时候编译器会分析它的参数并自动确定类型。因此,在引擎盖下,它将被重写为显式泛型调用。
喜欢
someCollection.Contains(someValue);
实际上正在编译为
Enumerable.Contains<CollectionInnerType>(someCollection, someValue);
Linq 有扩展方法Contains<>
。使用它时 - 您可以输入类型参数,也可以不输入。如果不输入 - C# 编译器将尝试隐式指定参数。
其他一些可枚举的类(例如 List<>
)实现自己的Contain
方法。
因此,当 IntelliSense 建议Contains<>
方法时 - 它是 Linq 的实现;当Contains
时 - 它是具体类的自己的实现。
关于实现的差异。自己的类实现似乎比 Linq 实现更快,因为 Linq 实现更抽象地从端点类。
有很多可能性。但这是最常见的。
我猜SomeOtherEntity
是对ICollection<T>
的引用.这是ICollection
上的标准方法,用于扫描内存中的引用相等性(取决于实现)。你可以在这里阅读。
还有来自 LINQ 的Contains<T>
。它是一种扩展方法。它适用于ICollection<T>
派生自IEnumerable<T>
。你可以在这里阅读这个。
它具有以下基本区别。
- 包含
- 是扩展方法,而包含不是。
- 包含 rerun
IEnumerable<T>
而 Contais 返回布尔值并确定您的项目是否存在。在"包含"中,您可以传递基于条件将返回IEnumerable<T>
的 deligate。