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

时间:2010-04-02 20:01:43

标签: c# .net linq lambda

说我有以下课程:

class Foo
{
    // ctor etc here

    public string Bar
    {
        get;
    }
}

现在,LinkedList的{​​{1}}声明如此:Foo

我如何为此写一个基本的包含<>()?

我希望能够做到这一点:

LinkedList<Foo>

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

由于

2 个答案:

答案 0 :(得分:6)

如果您想使用LinkedList.Contains,则可以执行此操作,但Foo可以执行IEquatable<Foo>LinkedList.Contains不能通过Predicate函数工作,而是通过搜索特定元素。要使用Contains,您可以写:

bool contains = list.Contains(foo);

但是,在这种情况下,您可能需要考虑使用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);

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

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

答案 1 :(得分:6)

在这种情况下,您想要的是.Any<T>()。像这样:

bool contains = list.Any(x => foo.Bar == x.Bar);

这说的是“这句话是真的吗?”在这种情况下,请考虑Count() > 0。然后你使用一个变量,在这种情况下xx代表你在迭代它时所在的list中的当前元素,因此对于你要比较和看到的每个元素如果它匹配。