C#中contains和contains<>的区别

4
我可能比较蠢,但是在VS whisper帮助中,containscontains<>有什么区别?有时我都会得到这两种内容,有时只有带有<>的那个。
问题是我正在尝试在where语句中使用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();

Contains<> 不存在。也许你的意思是 Contains<T> - Camilo Terevinto
1
是的,那就是我想说的,但在VS中是写成“代码”(Contains<>),所以我直接复制过来了。 - Bohuslav Sys
4个回答

4
如果您导航到 System.Linq.Enumerable.Contains 方法的定义,您会发现它被声明为通用扩展方法。
public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value);

有时候它被称为<type>参数,有时候不是,这是因为大多数情况下编译器会自动分析参数并确定类型。因此,在幕后,它将被重写为显式的通用调用。
就像
someCollection.Contains(someValue);

实际上正在编译为

Enumerable.Contains<CollectionInnerType>(someCollection, someValue);

非常感谢,当我意识到与Enumerable的连接时,它深入了我的思维。 - Bohuslav Sys

1
Linq有扩展方法Contains<>。当你使用它时,可以输入类型参数,也可以不输入。如果你没有输入,则c#编译器会尝试隐式指定参数。
一些其他的可枚举类(例如List<>)实现了自己的Contain方法。
因此,当IntelliSense提示Contains<>方法时,它是来自Linq的实现;当提示Contains时,则是具体类的自己的实现。
关于实现的区别。类的自身实现似乎比Linq实现更快,因为Linq实现更抽象于终端类。

Contains<>不存在。也许你的意思是Contains<T> - Camilo Terevinto
当然,我是指Contains<T>。但在作者的术语中,它看起来像是Contains<> - Mikhail Tulubaev
实际上,我认为它们没有区别。method_name<> - 是一个名为 method_name 的方法,带有一个泛型参数,method_name<,> - 带有两个等等。 - Mikhail Tulubaev
尝试编写Contains<>,您将会得到一个构建错误。泛型版本至少需要一个参数(在这种情况下只需要一个),例如Contains<TSource> - Camilo Terevinto
1
在这种情况下,尝试编写Contains<T>,你也会得到构建错误,因为没有叫做T的类。我认为,任何使用泛型的人都会理解我在这个答案中的意思。 - Mikhail Tulubaev

0

0

它们有以下基本区别。

  1. Contains是扩展方法,而Contains不是。
  2. Contains返回IEnumerable<T>,而Contains返回布尔值并确定您的项是否存在。在Contain中,您可以传递委托,根据条件返回IEnumerable<T>

Contains<>不存在。也许你的意思是Contains<T> - Camilo Terevinto
是的,我的意思是Contains<T>,我正在更新我的答案。 - Rohit Rohela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接