说我有以下课程:
class Foo
{
// ctor etc here
public string Bar
{
get;
}
}
现在,LinkedList
的{{1}}声明如此:Foo
我如何为此写一个基本的包含<>()?
我希望能够做到这一点:
LinkedList<Foo>
我是否正确地尝试这样做?
由于
答案 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
。然后你使用一个变量,在这种情况下x
,x
代表你在迭代它时所在的list
中的当前元素,因此对于你要比较和看到的每个元素如果它匹配。