Нужна помощь с этим базовым методом расширения <> () и лямбда-выражениями - PullRequest
2 голосов
/ 03 апреля 2010

Скажите, у меня есть следующий класс:

class Foo
{
    // ctor etc here

    public string Bar
    {
        get;
    }
}

Теперь у меня есть LinkedList из Foo 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));

Я пытаюсь сделать это правильно?

Спасибо

Ответы [ 2 ]

6 голосов
/ 03 апреля 2010

В данном случае вы хотите .Any<T>(). Примерно так:

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

Что это говорит "есть ли где-нибудь, где это утверждение верно?" Подумайте Count() > 0 в этом случае. Затем вы используете переменную, в данном случае x, x обозначает текущий элемент в list, который вы используете во время итерации, поэтому для каждого элемента, который вы сравниваете и проверяете, соответствует ли он.

6 голосов
/ 03 апреля 2010

Если вы хотите использовать LinkedList.Contains , вы можете сделать это, но Foo, но реализовать IEquatable<Foo>. LinkedList.Contains не работает через функцию предиката, а выполняет поиск определенного элемента. Чтобы использовать 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" отображается в текущей области видимости, при создании лямбда-выражения компилятор автоматически сгенерирует замыкание над переменной "foo", что позволит вам использовать его напрямую. Вам нужно только указать имя аргумента (x) для использования в функции предиката, созданной в лямбда-выражении.

Для этого требуется ссылка на System.Core.dll и using System.Linq; в верхней части файла, а также .NET 3.5 +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...