Pol*_*878 2 .net c# linq lambda
说我有以下课程:
class Foo
{
// ctor etc here
public string Bar
{
get;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个LinkedList的Foo声明像这样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)
我是否正确地尝试这样做?
谢谢
如果你想使用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+.
你想要的是.Any<T>()这种情况.像这样的东西:
bool contains = list.Any(x => foo.Bar == x.Bar);
Run Code Online (Sandbox Code Playgroud)
这说的是"这句话是真的吗?" 想想Count() > 0这种情况.然后你使用一个变量,在这种情况下x,x代表list你在迭代时所处的当前元素,因此对于每个元素你要比较并看它是否匹配.