包含和包含之间的区别<>在 c# 中

本文关键字:包含 区别 之间 | 更新日期: 2023-09-27 18:31:20

我可能很愚蠢,但是在VS耳语帮助中containscontains<>有什么区别?有时我两者都得到,有时只有<>的那个。

他们的事情是我试图在 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();

包含和包含之间的区别<>在 c# 中

如果导航到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>。你可以在这里阅读这个。

它具有以下基本区别。

    包含
  1. 是扩展方法,而包含不是。
  2. 包含 rerun IEnumerable<T>而 Contais 返回布尔值并确定您的项目是否存在。在"包含"中,您可以传递基于条件将返回IEnumerable<T> 的 deligate。