代码之家  ›  专栏  ›  技术社区  ›  DigitalZebra

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

  •  2
  • DigitalZebra  · 技术社区  · 16 年前

    假设我有以下课程:

    class Foo
    {
        // ctor etc here
    
        public string Bar
        {
            get;
        }
    }
    

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

    我将如何为此编写基本的contains<gt;()?

    我希望能够做到:

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

    我是否试图正确地进行此操作?

    谢谢

    2 回复  |  直到 16 年前
        1
  •  6
  •   Reed Copsey    16 年前

    如果你想用 LinkedList.Contains 你可以这样做,但是 Foo 但实施 IEquatable<Foo> . 链接列表。包含 不通过谓词函数工作,而是通过搜索特定元素。要使用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+。

        2
  •  6
  •   Nick Craver    16 年前

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

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

    这句话的意思是“这句话在哪里是真的?”思考 Count() > 0 在这种情况下。然后使用变量,在本例中 x , X 表示中的当前元素 list 在迭代过程中使用,因此对于每个元素,您都要比较并查看它是否匹配。