需要有关此基本包含<>()扩展方法和Lambda表达式的帮助

Pol*_*878 2 .net c# linq lambda

说我有以下课程:

class Foo
{
    // ctor etc here

    public string Bar
    {
        get;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我有一个LinkedListFoo声明像这样S:LinkedList<Foo>

我该怎么写一个基本的包含<>()呢?

我希望能够这样做:

Foo foo = new Foo(someString);
LinkedList<Foo> list = new LinkedList<foo>();

// Populate list with Foos

bool contains = list.Contains<Foo>(foo, (x => foo.Bar == x.Bar));
Run Code Online (Sandbox Code Playgroud)

我是否正确地尝试这样做?

谢谢

Ree*_*sey 6

如果你想使用LinkedList.Contains,你可以这样做,Foo但是实现IEquatable<Foo>. LinkedList.Contains不通过Predicate函数工作,而是通过搜索特定元素.要使用Contains,你会写:

bool contains = list.Contains(foo);
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,您可能需要考虑使用Enumerable.Any()扩展方法而不是Contains().这样做,它看起来像你以前的代码,除了你不需要第一个"foo":

Foo foo = new Foo(someString);
LinkedList<Foo> list = new LinkedList<foo>();

// Populate list with Foos

bool contains = list.Any(x => foo.Bar == x.Bar);
Run Code Online (Sandbox Code Playgroud)

由于"foo"在当前作用域中可见,因此在创建lambda表达式时,编译器将自动生成"foo"变量的闭包,允许您直接使用它.您只需要指定参数名称(x)以在lambda中创建的谓词函数中使用.

这需要引用System.Core.dll和using System.Linq;文件顶部的a 以及.NET 3.5+.


Nic*_*ver 6

你想要的是.Any<T>()这种情况.像这样的东西:

bool contains = list.Any(x => foo.Bar == x.Bar);
Run Code Online (Sandbox Code Playgroud)

这说的是"这句话是真的吗?" 想想Count() > 0这种情况.然后你使用一个变量,在这种情况下x,x代表list你在迭代时所处的当前元素,因此对于每个元素你要比较并看它是否匹配.