c# - 在这个基本的 Contains<>() 扩展方法和 Lambda 表达式方面需要帮助

标签 c# .net linq lambda

假设我有以下类(class):

class Foo
{
    // ctor etc here

    public string Bar
    {
        get;
    }
}

现在,我有一个 LinkedListFoo s 声明如下:LinkedList<Foo>

我将如何为此编写一个基本的 Contains<>()?

我希望能够做到这一点:

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));

我是否尝试正确执行此操作?

谢谢

最佳答案

如果你想使用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+。

关于c# - 在这个基本的 Contains<>() 扩展方法和 Lambda 表达式方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2568887/

相关文章:

c# - 无法解析类型 'Microsoft.AspNetCore.Identity.RoleManager` 的服务

.net - 如何确定应用程序是否为 Web 应用程序

c# - EWS 交换有时不会使用 StreamingSubscription 触发 NewMail 事件

c# - linq puzzle ...等同的语法...不等同的结果!

c# - 将一个 List<CustomType> 复杂合并到另一个 List<CustomType>

C# - 检查 Windows10 上是否安装了 UWP 应用程序

c# - 有序Hashtable遍历

c# - 如何与很多人建立自引用(自反)关系?

asp.net - 如何将旧的.NET项目切换到Linux?

c# - SubmitChanges 立即取回记录